排序算法哪家强之插入排序升级版----希尔排序

有人说:提出问题比解决问题更重要,我觉得这句话是非常有道理的,提问的过程就是思考的过程,而且提问式的思考往往比较有深度,所有呢,我今天换个叙述方式,以自问自答的形式来开始今天的分享.
1.为什么要有希尔排序
答: 我们虽然学习了插入排序,但我们应该知道这种算法的局限性,每一种理论都是为了解决某一具体领域的问题,它都是有局限性和大前提的.
它的时间复杂度为o(n^2),当数据量较大,而且数据无序时,直接插入排序算法就很吃力了.
因此: 希尔对该算法进行了优化, 于是希尔排序应运而生
2: 什么是希尔排序
答: 首先将设置一个元素间隔数gap,将原数组元素按照相同间隔数分组,然后对每一组进行排序(预排序)
刚开始将gap 设置较大,比如gap=5.然后,一次减小,直到gap=1时,所有元素已经为整体有序状态,
通过这种分组预排序的方式先将组内元素排序,再来利用插入排序可以提升了效率,于是就完成了对直接插入排序的优化

具体代码如下:

#include<stdio.h>
#include <stdio.h>


// 插入排序改进之希尔排序;
// 当待排序元素序列,元素个数较多,且序列无序时,直接插入排序的效率就大大降低了,这时候,直接插入的应用就收到了限制
//于是呢  我们的大佬"希尔"   将直接插入排序进行了优化,于是呢,我们的希尔排序就应运而生了



// 输入:  一个数组(数组元素及其个数)
// 基本思想如下:  首先将设置一个元素间隔数gap,将原数组元素按照相同间隔数分组,然后对每一组进行排序(预排序)
//刚开始将gap 设置较大,比如gap=5.然后,一次减小,直到gap=1时,所有元素已经为整体有序状态,
//通过这种分组预排序的方式先将组内元素排序,再来利用插入排序可以提升了效率,于是就完成了对直接插入排序的优化

void  shellsort(int *array, int size){
	int gap = 3;
	// 第一层循环用来控制分组间距
	while (gap--){
		// 第二层循环用来表示元素间距为gap时的组内元素
		for (int i = gap; i < size; ++i){
			int key = array[i];
			int end = i - gap;
			// 第三层循环用来控制元素间距为gap时,该组的待插入元素的插入情况
			while (end >= 0 && key < array[end]){
				array[end + gap] = array[end];
				end -= gap;
			}
			array[end + gap] = key;
		}
	}
	
}
void  print(int*array, int size){
	for (int i = 0; i < size; ++i){
		printf("%d ", array[i]);
	}
	printf("\n");
}



int main(){
	int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int size = sizeof(array) / sizeof(array[0]);
	shellsort(array, size);
	print(array, size);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值