【算法】--- 几分钟带你走进排序算法大门(上)

news2024/11/24 7:29:06

文章目录

  • 前言
  • 🌟一、常见的排序算法:
  • 🌟二、直接插入排序排序:
    • 📒2.1 基本思想:
    • 📒2.2 代码:
    • 📒2.3 时间复杂度:O(N^2)
    • 📒2.4 流程图详解:
  • 🌟三、希尔排序(缩小增量排序):
    • 📒3.1 基本思想:
    • 📒3.2 希尔排序思想图:
    • 📒3.3 希尔排序画图详解:
    • 📒3.4 代码:
    • 📒3.5 希尔排序画图详解:
    • 📒3.6 希尔排序总结:
    • 📒3.7 希尔排序时间复杂度:O(logN*N)
  • 🌟四、希尔排序和直接插入排序性能的比较:
  • 🌟总结:


前言

👧个人主页:@小沈熬夜秃头中୧⍤⃝❅
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:算法
🔑本章内容:排序算法-插入排序之直接插入排序和希尔排序
送给各位💌:落日弥漫的橘天边透亮的星 愿你永远向上.
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


提示:以下是本篇文章正文内容,下面案例可供参考

🌟一、常见的排序算法:

请添加图片描述
请添加图片描述

🌟二、直接插入排序排序:

📒2.1 基本思想:

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌时,就用了插入排序的思想

📒2.2 代码:

#include<stdio.h>
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void InsertSort(int* a,int n)
{
//[0, end]有序end+1位置的值插入[0, end]...让[0, end+1]有序
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end+1] = tmp;
	}
}
void TestInsertSoret()
{
	int a[] = { 3,5,2,7,1,4,9,8,0,6 };
	int sz = sizeof(a) / sizeof(a[0]);
	InsertSort(a, sz);
	PrintArray(a, sz);
}
int main()
{
	TestInsertSoret();
	return 0;
}

📒2.3 时间复杂度:O(N^2)

逆序的情况下最坏(每个数字都需要移动)等差数列:1+2+3+… …+(n-1)
顺序有序的情况下最好:O(N)

📒2.4 流程图详解:

请添加图片描述
在这里插入图片描述

🌟三、希尔排序(缩小增量排序):

📒3.1 基本思想:

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序

📒3.2 希尔排序思想图:

请添加图片描述
请添加图片描述

📒3.3 希尔排序画图详解:

请添加图片描述
在这里插入图片描述

📒3.4 代码:

#include<stdio.h>
void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		//gap = gap / 3 + 1;这种也可以保证最后一次gap=1进行直接插入排序
		
		//把间隔为gap的多组数据同时排

		//gap > 1时都是预排序接近有序
		//gap == 1时就是直接插入排序有序
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
void TestInsertSoret()
{
	int a[] = { 3,5,2,7,1,4,9,8,0,6 };
	int sz = sizeof(a) / sizeof(a[0]);
	ShellSort(a, sz);
	PrintArray(a, sz);
}
int main()
{
	TestInsertSoret();
	return 0;
}

📒3.5 希尔排序画图详解:

请添加图片描述
在这里插入图片描述

📒3.6 希尔排序总结:

  • 希尔排序是对直接插入排序的优化。
  • 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  • 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度:O(N^1.3—N42)
  • 稳定性:不稳定
  • 多且间隔为gap的预排序,gap由大变小
  • gap越大,大的数可以越快的到后面,小的数可以越快的到前面
  • gap越大,预排完越不接近有序,: gap越小,越接近有序
  • gap ==1时就是直接插入排序

📒3.7 希尔排序时间复杂度:O(logN*N)

while(gap>1){gap /= 2… …}外边这个循环跑logN
里面的for循环:

  • gap很大时,下面预排序时间复杂度O(N)
  • gap很小时.数组已经很接近有序了…这时差不多也是O(N)

🌟四、希尔排序和直接插入排序性能的比较:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
void TestOP()
{
	srand(time(0));
	const int N = 1000000;
	int* a1 = (int*)malloc(sizeof(int) * N);
	int* a2 = (int*)malloc(sizeof(int) * N);
	int* a3 = (int*)malloc(sizeof(int) * N);
	int* a4 = (int*)malloc(sizeof(int) * N);
	int* a5 = (int*)malloc(sizeof(int) * N);
	int* a6 = (int*)malloc(sizeof(int) * N);
	for (int i = 0; i < N; i++)
	{
		a1[i] = rand();
		a2[i] = a1[i];
		a3[i] = a1[i];
		a4[i] = a1[i];
		a5[i] = a1[i];
		a6[i] = a1[i];
	}
	int begin1 = clock();
	InsertSort(a1,N);
	int end1 = clock();

	int begin2 = clock();
	ShellSort(a2,N);
	int end2 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	printf("ShellSort:%d\n", end2 - begin2);
	free(a1);
	free(a2);
	free(a3);
	free(a4);
	free(a5);
	free(a6);
}
int main()
{
	TestOP();
	return 0;
}

🌟总结:

请添加图片描述
本章内容是对排序算法中的部分排序做了一个解析总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚观早报 | Midjourney官方在QQ开启内测;富士康印度新工厂动工

今日要闻&#xff1a;Midjourney官方在QQ开启内测&#xff1b;富士康印度新工厂动工&#xff1b;闲鱼将开收软件服务费&#xff1b;专家建议五年内禁售燃油车&#xff1b;笑果文化已被立案调查 Midjourney官方在QQ开启内测 5 月 15 日&#xff0c;据 Midjourney AI 微信公众号…

Unity之OpenXR+XR Interaction Toolkit实现 手枪模型的拆卸和组装

前言 之前我们曾实现过PC端的模型的拆卸和组装&#xff0c;如果使用VR模式来实现物体的拆卸呢&#xff1f;如何使用双手手柄来控制物体&#xff0c;拆卸物体呢&#xff1f;今天我们就来实现一个VR小Demo&#xff0c;基于OpenXR &#xff0c;XR Interaction Toolkit插件来实现。…

程序员面试宝典

前言 编者: 大淘宝技术开发工程师 / 刘苏宏(淘苏) 淘苏(花名)目前是大淘宝技术的一名开发工程师。从国企 跳槽来到互联网&#xff0c;【职业规划】是他被问得最多&#xff0c;也思考得 最多的问题。 扫一扫&#xff0c;关注公众号【大淘宝技术】 了解更多大淘宝技术干货沉淀 …

技术架构演进之路-Docker【一】

技术架构演进之路 了解每种技术架构以及如何演进的&#xff0c;熟悉Docker在架构中的核心作用 八大架构演进 单机架构 当前服务由应用服务和数据库服务两个服务组成&#xff0c;应用服务由 用户模块、商品模块、交易模块三个模块组成&#xff0c;我们可以理解它为 淘宝。用户模…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

通配符SSL证书是什么?

通配符SSL证书可以对申请的域名保护以外&#xff0c;还可以对下一级子域名无限使用&#xff0c;适合存在很多二级域名项目的网站&#xff0c;这样不需要额外对子域名申请SSL证书&#xff0c;还可以进行同意管理及部署SSL证书避免跨站窜站的问题。 申请通配符SSL证书 一、申请通…

SSH远程终端神器,你在用哪一款

唠嗑部分 在我们日常开发中啊&#xff0c;不可避免的要与Linux打交道&#xff0c;虽然我们作为开发&#xff0c;不要求我们对Linux有多么的专业&#xff0c;但是基本的操作还是要会的&#xff0c;举几个常用的例子&#xff1a; 1、查看nginx配置&#xff0c;配置转发 2、清理…

蓝桥杯模块学习4——数码管

第一章 硬件部分 1.1 电路的组成部分 1.1.1 译码器和锁存器 具体可回顾之前LED灯的文章&#xff1a; https://blog.csdn.net/weixin_63568691/article/details/130660096 1.1.2 共阳极数码管&#xff1a; 原理图&#xff1a; 功能&#xff1a; &#xff08;1&#xff09;可…

[网鼎杯 2020 青龙组]bang 复现--frida-dexdump安卓脱壳工具的使用

一.前言 在NSSCTF练习安卓逆向,第一次遇到安卓脱壳题 大佬的题解只有一句话"frida-dexdump一把嗦" 听起来容易做起来难,还遇到了安卓虚拟机的玄学bug,折磨了我很久,好在最终使用真机成功dump并得到flag 题目来源:[网鼎杯 2020 青龙组]bang 如果直接用jadx打开会发现…

重大喜讯!国产讯飞星火大模型将超越chatGPT!

引言 近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;自然语言处理成为了研究的热点。而在自然语言处理领域&#xff0c;ChatGPT是一个备受关注的模型&#xff0c;它的出现极大地推动了自然语言处理技术的发展。然而&#xff0c;最近国内一家公司——讯飞&#xff0…

记录--10个超级实用的Set、Map使用技巧

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Set是一种类似于数组的数据结构&#xff0c;但是它的值是唯一的&#xff0c;即Set中的每个值只会出现一次。Set对象的实例可以用于存储任何类型的唯一值&#xff0c;从而使它们非常适用于去重。 Map是…

如何为研发团队打造专属的效能提升路径|QECon 演讲回顾

近日&#xff0c;ONES 受邀参加 2023 QECon 全球软件质量&效能大会&#xff08;深圳站&#xff09;。在会上&#xff0c;ONES 研发效能改进咨询顾问陈仪&#xff0c;发表了主题为《如何为研发团队打造专属的效能提升路径》的演讲。 陈仪有着丰富的咨询经验&#xff0c;曾带…

C++考试

文章目录 1.程序填空1.1函数调用1.2前置和后置“”、“--”运算符重载1.3异常处理1.4文本文件读取 2.程序阅读2.1C编程基础2.2继承与派生2.3静态成员2.4继承与派生2.5 输入输出2.6 模板 3.程序改错3.1三种访问权限3.2 友元3.3抽象类不能实例化对象3.4常数据成员初始化必须使用构…

面试题总结

1、0513 1.重载和重写的区别? 重载发生在同一类中&#xff0c;同名的方法如果有不同的参数列表&#xff08;类型不同、个数不同、顺序不同&#xff09;则视为重载。 重写发生在父子类中&#xff0c;重写要求子类重写之后的方法与父类被重写方法有相同的返回类型&#xff0c;比…

Linux:在VMware中,如果虚拟机之前可以上网,之后突然不能上网,怎么办?

Linux系统版本&#xff1a;centos 7.5 x64位 VMware版本&#xff1a; VMware Workstation Pro 16 文章目录 前言一、什么原因会导致这种问题并如何解决它&#xff1f;原因①&#xff1a;虚拟机没有启动网络服务原因②&#xff1a;外部主机上VMware的【VMware NAT Service】服务…

Linux常用命令——htpasswd命令

在线Linux命令查询工具 htpasswd apache服务器创建密码认证文件 补充说明 htpasswd命令是Apache的Web服务器内置工具&#xff0c;用于创建和更新储存用户名、域和用户基本认证的密码文件。 语法 htpasswd(选项)(参数) 选项 -c&#xff1a;创建一个加密文件&#xff1b;…

用“平面两点距离”求三角形面积,再用“三角形面积”多边形面积

不小于 3 边的多边形&#xff0c;都可以任一顶点发出的边切分为 n - 2 个三角形。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&am…

跟着我学 AI丨教育 + AI = 一对一教学

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;它已经开始了改变教育的方式。本文将介绍AI在教育行业中的应用场景&#xff0c;当前从事AI 教育的公司有哪些以及这些公司所提供的教育产品的特点&#xff0c;和未来AI 教育的潜在实现方式。 AI在教育行业的…

【C++初阶】C/C++内存管理

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C初阶 ⭐代码仓库&#xff1a;C初阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

【数据结构】一篇带你彻底了解栈

文章目录 栈的概念及结构栈接口的实现栈的初始化入栈出栈获取栈顶元素判断栈是否为空获取栈中有效元素个数栈的销毁 总结 栈的概念及结构 栈&#xff1a;一种线性数据结构&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶 (Top&…