数据结构-希尔排序
一、概要
希尔排序(Shell Sort)是插入排序的一种改进版算法,也称为缩小增量排序(Diminishing Increment Sort)。希尔排序的基本思想是把待排序的元素按一定间隔分成若干个组,在每个组内进行插入排序,然后逐步缩小间隔间隔,直到间隔为1,最后对整个序列进行插入排序。因为插入排序在元素基本有序时效率较高,而希尔排序就是利用了这个特点。
希尔排序的具体实现方法如下:
对待排序的序列进行分组,分成 gapgap 个序列,每个序列中相隔 gapgap 个位置的元素为一组,例如当 gap=2gap=2 时,将下标为偶数的元素看作是同一组,下标为奇数的元素看作是同一组,两组元素都进行插入排序;
缩小间隔 gapgap 的值,继续分组,并重复步骤一,直到 gap=1gap=1,即整个序列为一组,进行最终的插入排序。
希尔排序的时间复杂度为 O(n32)O(n23),虽然比不上其他高级排序算法,但是对于中等规模的数据排序仍然表现出优秀的性能。希尔排序也是一种不稳定的排序算法,即相同元素在排序过程中可能会发生位置交换。
二.代码实现
oid ShellSort(int* a, int n) {int gap = n;while (gap > 0) {gap /= 2;for (int j = 0; j < gap; j++){for (int i = j; i <=n - gap; i += gap){int end = i - gap;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}
}
该函数的实现与经典的希尔排序不同,它采用了分组插入排序的方式。具体过程如下:
设定初始间隔
gap
为数组长度n
,然后将间隔缩小一半,直到gap=0
。对于每一个
gap
,将整个数组分成gap
个分组,依次对每个分组进行插入排序。在分组内部进行插入排序时,从第二个元素开始比较,将当前元素与已排序部分的最后一个元素依次进行比较,如果待排序元素比已排序元素小,则将已排序元素向右移动一个间隔
gap
的位置,直到找到一个比待排序元素小的已排序元素,将待排序元素插入其后的位置。循环完所有的分组后,缩小间隔
gap
的值,重复步骤 2 和 3,直到最后gap=0
,完成整个排序过程。
小蒋同学的CSDN: 用于CSDN文章中的代码分享 - Gitee.comhttps://gitee.com/jiang-yanxi123/xiaojiangs---csdn/tree/master/test0408