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 50
// 15 19
// 4 43
// 21 30
// 1 7
//第二次分组:gap = 5 / 2 = 2
// 10 4 1 19 30
// 15 21 50 43 7//第二次直接插入排序:
// 1 4 10 19 30
// 7 15 21 43 50
//第三次分组: gap = 2 / 2 = 1
// 1 7 4 15 10 21 19 43 30 50//第三次直接插入排序:
// 1 4 7 10 15 19 21 30 43 50