shell排序

算法思想:

采用分组的思想,把一组数字分为若干的小组,而在分组的过程当中,并不是几个几个紧挨着的分组,而是采用特定的
分组方式,每一次都让组内有序(),这样排序的好处是,每次排序都是将小的数据尽量往前赶,大的数据尽量往后
赶。在这里面,每一组的数字个数,在每一次分组的时候,都会缩小增量,比如第一次分组每组 3 个,第二次每组 5 个,
第三次每组 1 个这样去分。(最后一次就直接进行一次插入排序,优点在于,如果不执行前面的分组过程的话,数据的
移动次数更多,更复杂,经过排序之后,数据已经越来越有序了。利用直接插入排序特性)

总而言之 就是分组思想 组内直接插入排序 最后必须一个为一组


好的增量序列的共同特征:
1、 最后一个增量必须为 1;
2、应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况

时间复杂度:一般认为 O(n^1.3)到 O(n^1.5)之间
最坏时间复杂度 O(n^2)
最好时间复杂度 O(n)
空间复杂度:O(1)
稳定性:不稳定

void Shell(int *arr, int len, int gap)
{
	for (int i = gap; i < len; i++)
	{
		int tmp = arr[i];
		int j = i-gap;
		for (j; j >= 0; j=j-gap)
		{
			if (tmp < arr[j])
			{
				arr[j + gap] = arr[j];
			}
			else
			{
				break;
			}
		}
		arr[j + gap] = tmp;
	}
}
void ShellSort(int *arr, int len)
{
	int drr[] = { 5,3,1 };//增量按情况而定,最后一组必须为1
	int len_drr = sizeof(drr) / sizeof(drr[0]);
	for (int i = 0; i < len_drr; i++)
	{
		Shell(arr, len, drr[i]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值