希尔排序(增量排序)详解

介绍

希尔排序又称增量排序,它的核心思想是在插入排序基础上优化,先进行按照一个数量gap进行分组,每个分组中比较大小值,将较大的元素放在数组后面。

实例演示

现在有这样一个数组

int arr[] = {1,3,2,9};

首先先进行分组,我们分组的间隔值gap初始化为length/2,也就是4/2 = 2
分组如下:[1,2][3,9],比较分组中两者的值,较大者放后面。
不改变原数组的情况下,我们进行第一趟排序
[1,3,2,9]
第二趟排序,gap折半gap = 1,分组为4组,也就是一个元素一组,此时使用插入排序。
我们从gap位置开始比较gap-1下标的元素,就是从1和3开始比较,具体流程如下:
i= 1, 1<3, 不执行交换, 数组为[1,3,2,9]
i+1 = 2, 3>2, 执行交换 , 数组为[1,2,3,9],此时再向前比较,发现1<2,结束。
i+2 = 3, 3<9 不执行交换, 数组为[1,2,3,9]

代码实现

# include <stdio.h>

void shellsort(int arr[], int n) {
	int gap, i, j, temp;

	for (gap = n / 2; gap > 0; gap /= 2)
		for (i = gap; i < n; i++)
			for (j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
			{
				temp = arr[j];
				arr[j] = arr[j + gap];
				arr[j + gap] = temp;
			}
}

int main() {
	int arr[] = { 1,3,2,9 };
	int size = sizeof arr / sizeof arr[0];
	shellsort(arr, size);

	for (int i = 0; i < size; i++) {
		printf("i: %d\n", arr[i]);
	}
	return 0;
}

代码解释

最外层循变量gap控制间隔次数,从length/2开始,到1结束。
第二层循环变量i,从gap位置到last位置元素,递增到last,间隔一个元素。
第三层循环变量j,从i-gap开始,递减到0,间隔gap个元素
实际上第二层就是循环右区间的元素,第三层是循环左区间的元素,如果发现左边比右边大,那么我们进行交换。

posted @ 2022-11-13 01:04  蠢蛋快跑  阅读(482)  评论(0)    收藏  举报