C语言--八大排序之希尔排序算法

希尔(shell)排序:分组后(间隔式的分组)利用直接插入排序

简单来说就是,插入排序是间隔为一的数字之间进行比较,但希尔排序是间隔为gap的数字为一组,先进行一次插入排序,再不断缩小gap的值,重复以上操作。直到最后一个gap的值为1(分组数不是确定的,但在以后一定是1,才能保证有序)。

最好的情况是序列基本有序,且分组数为1,时间复杂度为:O(n)。

最坏的情况的时间复杂度:O(n)。(时间复杂度与选定的分组数有关)

稳定性(不稳定):希尔排序是特殊的插入排序,插入排序是相邻数字进行比较,等大的数字不交换顺序,所以是稳定的拍寻,但希尔排序:由于是分组排序,交换的过程中进行了跳跃式的交换,相同的元素可能在各自的插入排序中移动,改变了等大数字的先后顺序,所以是一个不稳定的排序。

代码如下:

//gap:分组数
void Shell(int* arr, int len, int gap)
{
	int tmp;//保存当前需要处理的值
	int j;
	for (int i = gap; i < len; i++)//从"第二个"元素开始
	{
		tmp = arr[i];
		for (j = i - gap; j >= 0; j -= gap)
		{
			if (arr[j] > tmp)
				arr[j + gap] = arr[j];
			else
				break;
		}
		arr[j + gap] = tmp;
	}
}
//打印函数
void show(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 4,6,2,8,9,0,1,7,3,5 };
	ShellSort(arr, sizeof(arr) / sizeof(arr[0]));
	show(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

运行结果

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNTkwNTIxMzE=,size_9,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值