码迷,mamicode.com
首页 > 编程语言 > 详细

希尔排序

时间:2015-05-07 12:34:12      阅读:182      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!