希尔排序
希尔排序是在插入排序的基础上进行的优化。
思想就是对原数列进行分组,对每一组进行插入排序。因为当组多元素少时(元素下标增量大)虽然乱序程度大但是元素少,当组少元素多时(元素下标增量小),虽然元素多但是乱序程度小,这样就对插入排序进行了时间上的优化。
对于如下的例子:
令初始的group size 为length / 2,分组如下:
对于每一组(两个元素)进行插入排序,排序后再以length / 4为group size进行分组,得到如下结果:
同理,进行同上的操作,group size继续/2,得到如下结果:
这次的分组就是最后一次分组了,因为group size = 1了,接下来就是对整个元素的插入排序,但是你会发现现在的增序程度(现在把小元素和大元素的下标偏离程度定义为增序程度)比起始的增序程度增强了很多,这也体现了希尔排序的优点。
代码如下:
void shell_sort(int *num, int len)
{
for(int group = len/ 2;group > 0;group /= 2)
{
for(int i = 0;i < group;i++)//区间的第一个元素
{
for(int j = i + group;j <= len;j += group)
{
if(num[j - group] > num[j])//从第一个不满足增序要求的元素开始进行插入排序
{
int k = j;
int temp = num[j];
while(k > group && temp < num[ k - group])
{
num[k] = num[k - group];
k -= group;
}
num[k] = temp;
}
}
}
}
}