老话重弹-希尔排序
在网上看到了很多版本的希尔排序,发现都将希尔排序与插入排序的实现分开了,但是希尔就是插入的改良版,因此从逻辑上说是能够复用插入排序代码。
以下是代码:
//incre为1时就是原始的插入排序
void InsertSort(int* first,int* last,int incre = 1);
//增量
const int increment[3] = {5,3,1};
//其实希尔就这么简单
void Shell(int* A,int num)
{
for(int i = 0;i < sizeof(increment) / sizeof(int);++i)
for(int j = 0;j < num - increment[i];++j)
InsertSort(A + j,A + num,increment[i]);
}
//发现STL的处理上下界方法非常好用,如果使用
//void InsertSort(int* A,int num,int incre = 1);
//你会发现在Shell中很难赋值。
void InsertSort(int* first,int* last,int incre)
{
int* pt = first + incre;
while(pt < last)
{
int key = *pt;
int* j = pt - incre;
for(;j >= first && *j > key;j -= incre)
*(j + incre) = *j;
*(j + incre) = key;
pt += incre;
}
}