有人说:提出问题比解决问题更重要,我觉得这句话是非常有道理的,提问的过程就是思考的过程,而且提问式的思考往往比较有深度,所有呢,我今天换个叙述方式,以自问自答的形式来开始今天的分享.
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;
}