希尔排序

发布时间 2023-05-19 21:01:25作者: harper886

今天浅写一下希尔排序因为我还没有完全理解
感觉理解希尔排序和选择,冒泡,插入完全不是一个等级,感觉难度上升了很多
每一个循环控制条件是那么的精巧,让人惊叹,让人头秃
还是那个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

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