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 条评论