0
点赞
收藏
分享

微信扫一扫

排序算法-----希尔排序

目录

前言

希尔排序(shell)

排序原理

大致思路

示例

 代码实现(C语言)

算法分析

时间复杂度

空间复杂度

稳定性


前言

        前面我有一篇插入排序的详细的文章讲解(链接:排序算法-----插入排序(图文详解)_灰勒塔德的博客-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

算法分析

时间复杂度

空间复杂度

稳定性

 好了,以上就是本期的全部内容了,我们下一期再见!!!

分享一张壁纸:

举报

相关推荐

0 条评论