插入排序(直接排序和希尔排序的比较)

 前言

我们学过较多的排序,排序分为:插入排序,选择排序,交换排序,归并排序这几种,这些排序在时间复杂度和空间复杂度上存在着一些差异,下面我们会对插入排序进行详细的讲解。

排序的分类

插入排序

直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插 ⼊到⼀个已经排好序的有序序列中,直到所有的记录插入完为止,得到⼀个新的有序序列。

插入排序动态展示
静态的示意图

 

插入排序与代码结合后的分析

插入排序的时间复杂度

时间复杂度为 O(N^{2}):在最差情况下,每次插入操作分别需要循环 n − 1、n − 2、…、 2、1 次,求和得到 (n − 1)n/2 ,因此时间复杂度为 O(N^{2}) 。在遇到有序数据时,插入操作会提前终 止。当输入数组完全有序时,插入排序达到最佳时间复杂度 O(n)。

插入排序的优点

插入排序的时间复杂度为O(N^{2}) ,而我们即将学习的快速排序的时间复杂度为 O(n log n) 。尽管插入排序 的时间复杂度更高,但在数据量较小的情况下,插入排序通常更快。

源代码

//插入排序
void InsertSort(int* arr, int n)
{
	for (int i = 1; i < n; i++)
	{
		int j = i - 1;
		int base = arr[i];
		//升序的写法
		while(j >= 0 && arr[j] > base)
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = base;
	}
}

希尔排序

希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap =n/3+1),把 待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进行排 序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序当gap较大的时候这时是预排序,当gap=1时,就相当于 直接插⼊排序 它是在直接插⼊排序算法的基础上进⾏改进⽽来的,综合来说它的效率肯定是要高于直接插⼊排序算 法的。

注意下图是网上寻找的动态示意图只是为了直观展示希尔排序,一般不采用n/2+1的情况因为这种情况分组太多。

希尔排序动态示意图

 

希尔排序结合代码的具体分析

希尔排序的时间复杂度

时间复杂度大约为O(n^{1.3})

结合代码具体分析

 下面图片是数据结构(C语⾔版)》---严蔚敏书中给出的时间复杂度的讲解。

希尔排序的优点

  1. 时间复杂度较低:尽管最坏情况下的时间复杂度是 O(n2)O(n2)(类似于插入排序),但在平均情况下,希尔排序的时间复杂度通常在 O(n1.5)O(n1.5) 到 O(nlog⁡2n)O(nlog2n) 之间,根据所使用的增量序列而有所不同。

  2. 减少数据移动:希尔排序通过先对元素进行间隔较大的位置的排序,逐渐将元素移到最终的位置,减少了数据移动的次数。

  3. 适用于大规模数据:由于希尔排序在处理大规模数据时相比普通的插入排序有明显的速度优势,它尤其适用于部分有序的数据。

源代码

void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap>1)
	{
		 gap = gap/ 3 + 1;
		for (int j = 0; j < n - gap; j++)
		{
			int base = arr[j + gap];
			while (j >= 0 && arr[j] > base)
			{
				arr[j + gap] = arr[j];
				j -= gap;
			}
			arr[j + gap] = base;
		}
	}
}

总结

插入排序和希尔排序在时间复杂度和便利性方面都有一定的差异。插入排序适用于小规模数据或者已经基本有序的数据,而希尔排序适用于中等规模数据,尤其是部分有序的数据。在实际应用中,可以根据具体的需求和数据特点选择合适的排序算法。以上就是本期的总结,期待各位大佬的一键三连(点赞,收藏,关注)。

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值