希尔排序
采用分治法的思想,并且是插入排序的改进方法,时间复杂度位n^(3/2);
按增量gab变化,将数组分为n/gap组,每i+gap, i+2gap, i+3gap…为一组;
当gap=1时,整个数组就是一组。
[注意:gap/2并不是最优的增量,gap的取值很难计算,所以我们采用数据科学家提出的值,如之后代码所示]
代码所选步长和图例不同,不是gap/2.
template<typename T>
void shellSort(T arr[], int n){
//这里h既为步长gap, 此处所选的步长数值较好
int h = 1;
while( h < n/3 )
h = 3 * h + 1;
while( h >= 1 ){
for( int i = h ; i < n ; i ++ ){
// 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
T e = arr[i];
int j;
for( j = i ; j >= h && e < arr[j-h] ; j -= h )
arr[j] = arr[j-h]; //移位操作
arr[j] = e;
}
h /= 3;
}
}