【数据结构】10.插入排序与希尔排序

一、插入排序

1.1 插入排序的基本思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

在现实生活中的应用如:玩扑克牌时

1.2 插入排序的分析

当插入第i(i>=1)个元素时,前面的array0,array1,...,arrayi-1已经排好序,此时用arrayi的排序码与arrayi-1,arrayi-2,...的排序码顺序进行比较,找到插入位置即将arrayi插入,原来位置上的元素顺序后移。这里我们默认在end及end之前的元素已经排好序了。

1.3 插入排序的实现

c 复制代码
//直接插入排序
//保证前n个数据有序
void InsertSort(int* arr, int n)
{
	for(int i=0;i<n-1;i++)
	{
		int end=i;
		//前n个有序的情况下对下一个排序
		int temp = arr[end+1];
		while (end >= 0)
		{
			if (arr[end] < arr[end+1])
			{
				swap(&arr[end], &arr[end+1]);
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end+1] = temp;
	}
}

1.4 插入排序的时间复杂度分析

二、希尔排序 ( 缩小增量排序 )

2.1 希尔排序的基本思想

  1. 逆序有序的数组排序时,时间复杂度为 O(n^2)),此时效率最低。
  2. 顺序有序的数组排序时,时间复杂度为O ( n ),此时效率最高

我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为希尔排序。

2.2 希尔排序的分析

希尔排序是对插入排序的优化,基本思路是先选定一个整数作为增量,把待排序文件中的所有数据分组,以每个距离的等差数列为一组,对每一组进行排序,然后将增量缩小,继续分组排序,重复上述动作,直到增量缩小为1时,排序完正好有序。

希尔排序原理是每一对分组进行排序后,整个数据就会更接近有序,当增量缩小为1时,就是插入排序,但是现在的数组非常接近有序,移动的数据很少,所以效率非常高,所以希尔排序又叫缩小增量排序。

每次排序让数组接近有序的过程叫做预排序

c 复制代码
//希尔排序
void ShellSort(int* arr, int n)
{
	int gap = n;
	while(gap>1)
	{
		gap =gap/ 3+1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int temp = arr[end + gap];
			while (end >= 0)
			{
				if (arr[end] < arr[end + gap])
				{
					swap(&arr[end], &arr[end + gap]);
					end-=gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = temp;
		}
	}
}

2.4 希尔排序时间复杂度分析

相关推荐
迷枫71237 分钟前
SQL性能排查记录
java·数据库·sql
渡我白衣1 小时前
深入理解 Transformer:Transformer 究竟是什么?
java·linux·开发语言·c++·人工智能·深度学习·transformer
无限码力2 小时前
8.26华为OD机试真题 新系统【字符串回文判断】
算法·华为od·华为od机考·华为od机试·华为od上机考试真题·华为od最新机试真题题解·华为od机试真题题库
Tisfy4 小时前
LeetCode 1927.求和游戏:抵消+看最值
java·leetcode·游戏·题解·博弈论
玖玥拾4 小时前
LeetCode 125 验证回文串
算法·leetcode
xu_wenming8 小时前
嵌入式软件架构中的6种解耦艺术
c语言·驱动开发·嵌入式硬件·架构
GlueNa2SiO38 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
Capricorn198810 小时前
解决全网抄 Karpathy 导致的 LLM Wiki 污染?基于知芽 Notebook Skill 的 raw/ 笔记法排障指南
大数据·论文阅读·人工智能·笔记·论文笔记
秋饼10 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
壹玖玖肆10 小时前
openGauss使用笔记
笔记