希尔排序(增量排序)详解
介绍
希尔排序又称增量排序,它的核心思想是在插入排序基础上优化,先进行按照一个数量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个元素
实际上第二层就是循环右区间的元素,第三层是循环左区间的元素,如果发现左边比右边大,那么我们进行交换。