首页 > 编程语言 > 详细

希尔排序

时间:2015-05-07 12:33:06      阅读:302      评论:0      收藏:0      [点我收藏+]

希尔排序

希尔排序是本人非常喜欢的一种排序,虽然网上很多人说这种排序是不稳定的,但是实践出真知,大家可以将所有排序方法放在一起跑一堆数据,希尔排序速度是非常快的,很多时候甚至比快排更快哦!也许是我的实验数据不够吧,大家可以亲测一下!

原理:

希尔排序的原理很简单,只要前面的插入排序看懂了,希尔排序就会很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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!