原理:
希尔排序算法是直接插入排序算法演变而来的一个算法,其原理是在直接插入排序的基础上增加了一个跨度。
(直接插入排序:http://blog.csdn.net/elijah_wong/article/details/56287491)
举例:
例如我们让首次跨度为5。
2,12,5,57,31,31,90,32,95,76
第一次完整的比较2和31,12和90,5和32,57和95,31和76.因为前面的数字都小于后面比较的数字,所以第一次比较后没有改变。
然后我们减小跨度为2。
2,12,5,57,31,31,90,32,95,76
第二次完整的比较2和5和31和90和95,12和57和31和32和76。于是生成了一下的数据。
2,12,5,31,31,32,90,57,95,76
然后我们减小跨度为1。
当跨度为1的时候执行的就和直接插入排序的一致了。生成排序好的数据。
2,5,12,31,31,32,57,76,90,95
代码:
void ShellSort(int a[], int nlen)
{
int temp, j;
int gap = nlen;
do
{
gap = gap / 2;
for (int i = gap; i != nlen; ++i)
{
if (a[i - gap] > a[i])
{
temp = a[i];
for (j = i - gap; a[j] > temp; j-=gap)
{
a[j + gap] = a[j];
}
a[j + gap] = temp;
}
}
} while (gap > 1);
}
总结:
我们可以从代码的角度上看出希尔排序只是简单的从直接插入排序上面增加了一个跨度,跨度逐渐递减。当待排序的数据相对有序(小数在前或大数在前)的情况下,希尔排序的效果最好。但由于元素的个数及其顺序和间隔的设定。其时间复杂度显得不是很稳定。平均下来应该在O(nlog2n) ~ O(n^2)之间。