一、希尔排序的步骤
1、选定一个增量h,按h作为分组的依据,对数据进行分组
2、对分好组的每一组数据完成插入排序
3、减小增量,最小为1,重复第2步
二、增量h的选定
h初始值的选定规则:
int h = 1;
//计算h的初始值,num为数组的元素个数
while (h < num / 2)
{
h = 2 * h + 1;
}
h的循环规则
h = h/2;
三、代码和运行结果:
#include <iostream>
using namespace std;
void shell_sort(int arry[], int num)
{
int h = 1;
//计算h的初始值
while (h < num / 2)
{
h = 2 * h + 1;
}
cout << "h=" << h << endl;
while (h >= 1)
{
//每次分组,要插入的第一个元素的index 是h
for (int i = h; i < num; i++)
{
//开始插入排序
for (int j = i; j >= h; j -= h)
{
if (arry[j - h] > arry[j])
{
int tmp = arry[j - h];
arry[j - h] = arry[j];
arry[j] = tmp;
}
}
}
h = h / 2;
cout << "h=" << h << endl;
}
}
int main()
{
int arr[] = {2,1,3,5,5,6,7,4,1};
shell_sort(arr,sizeof(arr)/sizeof(arr[0]));
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0])); i++)
cout << arr[i] << endl;
return 0;
}
运行结果: