希尔排序是本人非常喜欢的一种排序,虽然网上很多人说这种排序是不稳定的,但是实践出真知,大家可以将所有排序方法放在一起跑一堆数据,希尔排序速度是非常快的,很多时候甚至比快排更快哦!也许是我的实验数据不够吧,大家可以亲测一下!
希尔排序的原理很简单,只要前面的插入排序看懂了,希尔排序就会很easy,因为希尔排序是是对插入排序的增强版。希尔排序提出的思想是先让数据局部有序,然后再排。比较插入排序(选择等),比较的都是比较相邻的元素,但是其实我们可以以某个值为步长,然后使步长组内的元素局部有序,如果再某个间隔元素有序,再使用插入排序,其实移动的数据是非常少的。
// 希尔排序
void shellSort(int arr[], int len)
{
for (int gap = len / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < len; i++)
{
int k = i;
int temp = arr[k];
// 注意这里是 k>=gap
while ((k >= gap) && (temp < arr[k - gap]))
{
arr[k] = arr[k - gap];
k -= gap;
}
arr[k] = temp;
}
}
}
ps:步长的选择时不确定的,这里是以数组长度不断除以2获取步长。当然你也可以是步长为5,4,3,2,1等等组合来作为步长。希尔排序的不稳定性也在这里,会因为数据原本的顺序,以及步长的影响,效率不同。
时间复杂度:O(n^1.3 ~ n^2)
原文地址:http://blog.csdn.net/u013647382/article/details/45557827