简要介绍
是直接插入排序的高效改进版本,又称“缩小增量排序”。非稳定排序算法,时间复杂度O(n log n)~O(n2),空间复杂度O(1),对规模非常大的数据排序不是最优选择。
基本思想
实质是一种分组插入方法。把元素按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个元素被分为一组,算法结束。
实现思路
将所有元素看作整体,先取一个小于size的整数d1作为第一个增量,将所有距离为d1的倍数的元素放在同一组中,在组内进行直接插入排序;再取第二个增量,将元素整体再分为数组进行组内排序,直到增量为1。
一般初次取序列元素个数的一半为增量,以后每次减半,直到增量为1。
代码实现
void ShellSort(int arr[], int size){
int gap = size / 2; //设置增量
while (gap > 0){
for (int i = gap; i < size; ++i){ //分组
int tmp = arr[i];
int index = i - gap;
while (index >= 0 && arr[index] > tmp){ //组内排序
arr[index + gap] = arr[index];
index -= gap;
}
arr[index + gap] = tmp;
}
gap /= 2;
}
}