希尔排序又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本,但它是非稳定的排序算法,该方法因D.L.Shell于1959年提出而得名。
其基本思路也很简单,我们设置一个gap计算每次的缩小增量,每趟排序以gap进行分组,例如假设当前的gap为2的话,那么他的分组就是array[0],array[2],......为1组,下一组为array[1],array[3],......依此类推,核心算法就是改进后的直接插入排序,但此时排序间隔不再是1,而是gap为间隔。当gap为1的时候数据已经有一定的顺序了,此时相当于作了一次原始的直接插入排序。该算法之所以高效的原因是因为它采用了分治法的思想。
这里有一道OJ题的引例:
题目描述
给出一个数据序列,使用希尔排序算法进行降序排序。
间隔gap使用序列长度循环除2直到1
输入
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推
输出
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。
代码实现:
#include <iostream>
using namespace std;
void insertSort(int *array, int gap, int size) {
int j;
for (int i = gap; i < size; ++i) {
int temp = array[i];
for (j = i - gap; j >= 0; j = j - gap) {
if (temp > array[j]) {
array[j + gap] = array[j];
}
else {
break;
}
}
array[j + gap] = temp;
}
}
int main() {
int t;
cin>>t;
while (t--) {
int n;
cin>>n;
int *array = new int[n];
for (int i = 0; i < n; ++i) {
cin>>array[i];
}
int gap = n / 2;
while (gap != 0) {
int i, j;
insertSort(array, gap, n);
for (j = 0; j < n; ++j) {
if (j < n - 1) {
cout<<array[j]<<" ";
} else {
cout<<array[j]<<endl;
}
}
gap = gap / 2;
}
cout<<endl;
}
return 0;
}