·什么是希尔排序
首先我们要清除的是,希尔排序是插入排序的一种改进,又称“缩小增量排序”。
希尔排序是根据步长将一组序列分成多组,再在不同的组中进行插入排序,当步长不断减小直至1时,希尔排序便完成了。
下面是图例:
·时间复杂度
希尔排序的时间复杂度取决于它的所取的增量函数,目前最好的是比较和移动次数减少至n^1.3。这也是他的最小时间复杂度O(n^1.3)。
·空间复杂度
同之前一样,无需新的空间,空间复杂度为O(1)。
·希尔排序的稳定性
我们在插入排序中可以看出相同数字的前后顺序并不会发生变化,但是在希尔排序中,由于不同步长所形成的分组插入排序,相同的数字在这一过程中是会发生前后顺序的改变的。
因此,希尔排序是一种能够不稳定的排序算法。
·ShellInsertion.c
#include <stdio.h>
#include <stdlib.h>
void ShellSort(int a[], int length)
{
int increment;
int i, j;
int temp;
for (increment = length / 2; increment > 0; increment /= 2)
{
for (i = increment; i < length; i++)
{
temp = a[i];
for (j = i - increment; j >= 0 && temp < a[j]; j -= increment)
{
a[j + increment] = a[j];
}
a[j + increment] = temp;
}
}
}
int main()
{
int i, j;
int a[] = { 5, 18, 151, 138, 160, 63, 174, 169, 79, 200 };
printf("待排序的序列是: \n");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
ShellSort(a, 10);
printf("\n排序后的序列是: \n");
for (j = 0; j < 10; j++)
{
printf("%d ", a[j]);
}
printf("\n");
system("pause");
return 0;
}