1.10 希尔排序
1.10.1 介绍
**希尔排序(Shell Sort),**是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,他是简单插入排序经过改进后的版本,也称为缩小增量排序。
1.10.2 原理
1.10.3希尔排序实现
注:sort.h 在c语言排序总结—前序准备中
希尔排序代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "sort.h"
int main() {
//生成LENGTH长度的随机数组,并展示出来
int arr[LENGTH];
createRandomArray(arr);
int count = 0;
for (int i = 0; i < LENGTH; i++) {
printf("%-10d", arr[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
printf("\n");
//统计排序的时间
int begin, end;
begin = clock();
//调用排序
shellSort(arr);
end = clock();
//输出排序结果
for (int i = 0; i < LENGTH; i++) {
printf("%-10d", arr[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
//输出排序时间
printf("排序时间为time=%d\n", end - begin);
system("pause");
}
/*
9 1 5 8 3
外层循环,循环至增量为0
第一次增量 increment = 5/2 = 2
循环以增量为步长,从中间的5 开始 内层循环
9 5 为一组 比较之后使用简单插入排序:5 1 9 8 3
1 8 为一组 比较之后使用简单插入排序:5 1 9 8 3
5 9 3 为一组 比较之后使用简单插入排序: 3 1 5 8 9
第二次增量 increment = 2/2 = 1
即进行简单插入排序: 1 3 5 8 9 仅进行了一次简单插入
完成排序
*/
void shellSort(int arr[]) {
int increment = LENGTH; //初始化增量
//最外层循环,循环增量的变化,直到增量increment=0为止
for (increment /= 2; increment > 0; increment /= 2) {
//内存循环循环各组的简单插入排序
for (int i = increment; i < LENGTH; i++) {
//如果新数比前一个数小
if (arr[i] < arr[i - increment]) {
int temp = arr[i];
int j = i - increment;
for (;j>=0 && arr[j] > temp; j -= increment) {
arr[j + increment] = arr[j];
}
arr[j + increment] = temp;
}
}
}
}
希尔排序在10000数据量下的耗时结果为1毫秒: