目录
前言
前面我有一篇插入排序的详细的文章讲解(链接:排序算法-----插入排序(图文详解)_灰勒塔德的博客-CSDN博客)今天我们接着学习排序算法中的希尔排序(shell_sort),希尔排序跟插入排序是有一定关联的,可以这么说,希尔排序是对插入排序的再进一步优化,下面我们就开始学习吧!
希尔排序(shell)
排序原理
大致思路
示例
第一步,先进行分组,此时设置区间gap为5,分组完成后进行初步排序,结果如下所示:
第二步,缩小gap,可以去通过整除去缩小,此时gap为2,再次分组排序,结果如下:
第三步,此时gap再次缩小,为1,那么就只有一组了,也就是整个数组为一个整体去排序:
图解如下:
代码实现(C语言)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//希尔shell排序
void shell_sort(int* n,int length) {
int i, j, gap;
for (gap = length / 2; gap > 0; gap /= 2) {
for (i = 0; i < gap; i++) {
for (j = i+gap; j < length; j += gap) {
//以下对每一组进行插入排序
int temp = n[j];
int k = j - gap;
if (n[j] < n[j - gap]) {
while (k >= 0 && n[k] > temp) {
n[k + gap]= n[k];
k -= gap;
}
n[k + gap] = temp;
}
}
}
}
}
int main() {
int array[10];
srand((unsigned)time(0));
for (int i = 0; i < 10; i++) {
array[i] = rand() % 20;
}
for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
printf("%d ", array[i]);
}
printf("\n排序后:");
shell_sort(array, sizeof(array) / sizeof(int));//希尔排序
for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
printf("%d ", array[i]);
}
}
//输出结果:
//3 9 17 4 5 18 13 14 12 15
//排序后:3 4 5 9 12 13 14 15 17 18
算法分析
时间复杂度
空间复杂度
稳定性
好了,以上就是本期的全部内容了,我们下一期再见!!!
分享一张壁纸: