先复习一遍插入排序:
template<typename T>
void insertionsort(T arr[], int len)
{
for (int i = 1; i < len; ++i)
{
T e = arr[i];
int j;
for (j = i; j > 0 && arr[j-1] > e ; --j)
{
arr[j] = arr[j - 1];
}
arr[j] = e;
}
}
在插入排序的基础上对算法进行改进:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
template<typename T>
void shellsort(T arr[], int len)
{
int step;
for (step = len / 2; step != 0; step /= 2)//初始步长设置为len/2,但步长为len/2并不一定是最优步长。
{
for (int i = 1; i<len; i++)
{
T temp = arr[i];
int j = i;
for (; j-step>0 && arr[j - step]>temp; j -= step)
{
arr[j] = arr[j - step];
}
arr[j] = temp;
}
}
}
测试:在这里我们生成一个0-100之间的1000 0000个随机数进行排序。
int main()
{
int n=10000000;
int *arr=generateArray(n,0,100);
sortTest("selection sort",selectionsort,arr,n);
delete[] arr;
return 0;
}
可以看到,排序时间只用了2.391s,比直接插排或者选择排序不知快到里那里去.....