sort_shell.c
//
// Created by YQQ on 3/31/2024.
//又称缩小增量排序,先将待排序表中相隔某个增量d(一般初始d = n/2,n为表长)的记录组成一个子表,对每个子表进行直接插入排序,
//d每次减半直至等于1时已经基本有序,此时再执行一次直接插入排序即可
//空间复杂度:O(1)
//时间复杂度:最坏情况下退化成直接插入排序,O(n^2)
//存储结构:顺序存储---由于每次需要用增量gap寻找其子表中的相邻元素,所以要具备随机存取的特性
//
void sort_shell(int *a,int n){
int i,j,k,gap;
for(gap = n/2;gap >= 1;gap = gap/2){//步长每次减半,直到为1
for(i = 0; i < gap ; i++){//i控制每次开始直接插入排序的位置
//每次在其步长为gap的分组里执行直接插入排序
for (j = i + gap; j < n; j = j + gap){
if(a[j] < a[j - gap]){ //逆序
int temp = a[j];//将较小的值存到temp里
for(k = j - gap; k >= 0 && a[k] > temp; k = k - gap){
//将a[j]前大于temp的元素后移
a[k + gap] = a[k];
}
a[k + gap] = temp;
}
}
}
}
}
main.c
#include <stdio.h>
void sort_shell(int *a,int n);
int main() {
int a[] = {32,16,12,68,46,75};
int n = sizeof(a) / sizeof(a[0]); // 计算数组元素个数
sort_shell(a,6);//希尔排序结果
for(int i = 0;i < 6;i++){//排序后输出
printf("%d",a[i]);
if (i < n - 1) { // 如果不是最后一个元素,则输出逗号
printf(",");
}
}
return 0;
}
运行结果: