【希尔排序和直接插入排序】

一. 直接插入排序

  • 基本思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…array[i-1]已经排好序,此时用array[i]的排序码值与array[i-1],array[i-2],…array[0]的排序码值进行比较,找到符合位置即将array[i]插入,原来位置上即以后的元素顺序挨个后移一位。
  • 代码实现:

void InsertSort(int* arr, int n)
{
	for(int i = 0;i<n-1;i++)
	{
		int end = i;
		int tmp = arr[end+1];
		while(end>=0)
		{
			if(tmp<arr[end])
			{
				arr[end+1] = arr[end];
				end-=1;
			}
			else
				break;
		}
		arr[end+1] = tmp;
	}
}
  • 过程思想:

  • 在这里插入图片描述

  • 性能分析:

  • 元素集合越接近有序,直接插入排序算法的时间效练就越高

  • 时间复杂度:o(N^2)

  • 空间复杂度:o(1)

  • 稳定性: 稳定

希尔排序

  • 基本思想:

  • 选定小于n的值为gap进行分组,进行预排序,当gap==1时,数组已经接近有序了,所以现在用直接插入就会很快。
  • 代码实现:

void ShellSort(int* a, int n)
{
	gap = n;
	while(gap>1)
	{
		gap = gap/3+1;
		for(int i = 0;i<n-gap;i++)
		{
			int end = i;
			int tmp = a[end+gap];
			while(end>=0)
			{
				if(tmp<a[end])
				{	
					a[end+gap] = a[end];
					end-=gap;
				}
				else
					break;
			}
			a[end+gap] = tmp;
		}
	}
}
  • 特性总结:希尔排序由于gap的取值有很多方法和组,导致没有一定规律去计算,因此目前为止众多大佬通过大量实验证明例如,Knuth认为在关键没平均次数和对象平均移动次数大约在N的1.25到1.6N的1.25范围内,因此暂时按这个算。

1.时间复杂度o(N^1.23)
2. 稳定性:不稳定
3. 空间复杂度:o(1)

总结:gap越大,预排越快,越不接近有序。
gap越小,预排越慢,此时越接近有序。
当gap==1是就是直接插入排序,结果就有序了。

小白理解插入和希尔排序。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维生素C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值