shell 排序(减小缩量排序)
稳定性:不稳定
排序思想:将多个数据集先进行分组,再对每组集和进行插入排序。(gap表示分的组数目,(gap-1)可表示每组数据的间隔)
实现代码:
void shell_sort(int *array, int length)
{
int gap = 0;
int i = 0;
int j = 0;
int value = 0;
for(gap = length / 2; gap > 0; gap /= 2){ //每次减小增量
for(i = gap; i < length; ++i){
//每次进行插入排序
value = array[i];
for(j = i - gap; j >= 0 && array[j] > value; j -= gap){
array[j + gap] = array[j];
}
array[j + gap] = value;
}
}
}
例如:
// 10 15 4 30 1 50 19 43 21 7 length = 10 gap = 10 / 2 = 5
//分组
// 10 50
// 15 19
// 4 43
// 30 21
// 1 7
// 10 15 4 21 1 50 19 43 30 7 gap /= 2 gap = 2 (插入)
//分组:
// 10 4 1 19 30
// 15 21 50 43 7
//进行直接插入排序:
// 1 4 10 19 30
// 7 15 21 43 50
// 1 7 4 15 10 21 19 43 30 50 gap /= 2 gap = 1 (在进行一次直接插入排序即可)