今天浅写一下希尔排序因为我还没有完全理解
感觉理解希尔排序和选择,冒泡,插入完全不是一个等级,感觉难度上升了很多
每一个循环控制条件是那么的精巧,让人惊叹,让人头秃
还是那个b站视频的链接
点我看希尔排序
我感觉学习排序一定要自己动手画一下,用电脑上面的画图软件就行,不然真的极其难以理解
现在我们来看一看代码
#include <stdio.h>
/*
该函数是希尔排序函数
需要无序数组和数组长度
该函数没有返回参数
*/
void shell(int arr[], int len) {
int temp;
// int len1=len/3;
int h = 1;
int t = len / 3;
while (h < t) {
h = 3 * h + 1; //这一步是让h接近t,同时在最后除以3的时候可以让h顺利的得到1;
}
while (h >= 1) { //步长大于等于1的时候执行下面的代码,当步长等于1时,最后一次执行的插入排序会把,全部的顺序排好。
for (int i = h; i < len; i++) {
/*这里的i就像一个指针一样指着步长下标的那个数值元素
第一次这个i是在步长,没一次循环都会让i+1,当i=len-1时就指向了最后一个元素*/
for (int j = i; j >= h && arr[j] < arr[j - h]; j = j - h) {
/*
这一段代码怎么说呢,就是对分完组的那些单个的元素进行交换
位置一开始可能只对应两个元素,但随着j的增加,会有很多个元素互相
交换位置,后面的判断就是看一下相邻两个元素的大小
如果前面的大于后面的就交换位置
最后的循环一次之后执行的控制变量的变化也很精巧,每次都相后对应两个元素
*/
temp = arr[j];
arr[j] = arr[j - h];
arr[j - h] = temp;
}
// for(int k=0;k<len;k++){
// printf("%d ",arr[k]);
// }
// printf("\n");
}
h = h / 3; //步长每次变化
}
}
int main() {
int arr[] = {7, 6, 2, 10, 12, 24, 8, 0, 1, 0, 3, 4};
int len;
len = sizeof(arr) / sizeof(arr[0]);
shell(arr, len);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
来一张运行时的分步的打印结果,这里的h的初始值为4,每次循环h除以2

注意理解为什么
其实写完我还是没有完全的理解希尔排序,还是需要慢慢的体会