成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

希爾排序就這么簡(jiǎn)單

paulli3 / 430人閱讀

摘要:這時(shí)就用簡(jiǎn)單插入排序?qū)?shù)列直至已序從直觀上看希爾排序就是把數(shù)列進(jìn)行分組不停使用插入排序,直至從宏觀上看起來(lái)有序,最后插入排序起來(lái)就容易了無(wú)須多次移位或交換。

一、希爾排序介紹

來(lái)源百度百科:

希爾排序(Shell"s Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方法因D.L.Shell于1959年提出而得名。

從上面我們很容易看出來(lái),它是插入排序的高級(jí)版

回顧一下插入排序:

將數(shù)據(jù)插入到已有序的數(shù)列中

排序前:將每個(gè)元素看成有序的數(shù)列

第一趟排序后:得到一個(gè)有序數(shù)列,其大小為2

第二趟排序后:得到一個(gè)有序數(shù)列,其大小為3

第三趟排序后:得到一個(gè)有序數(shù)列,其大小為4

........每一趟插入排序,都可以將一個(gè)無(wú)序值插入一個(gè)有序數(shù)列,直至全部值有序

如果給出的數(shù)組足夠亂的話,那么插入排序所耗費(fèi)的時(shí)間是O(n^2)

既然希爾排序是插入排序的高級(jí)版,那它做了哪些優(yōu)化呢??讓我們來(lái)看看:

希爾排序在排序前:將一個(gè)序列分成了好幾個(gè)序列

在第一趟排序時(shí):將這幾個(gè)序列做插入排序。排序后,部分較大的數(shù)字往后靠,部分較小的數(shù)字往前靠

在第二趟排序時(shí):將這個(gè)序列又分了好幾個(gè)序列做插入排序(但比第一次分的數(shù)要少,ps:如果第一次分5個(gè),第二次可能就2個(gè)了)。排序后,部分較大的數(shù)字往后靠,部分較小的數(shù)字往前靠

................

在第n趟排序時(shí):將這個(gè)序列又分了好幾個(gè)序列(直到剩下一個(gè)序列),從宏觀上看,此序列就基本是有序的了。這時(shí)就用簡(jiǎn)單插入排序?qū)?shù)列直至已序

從直觀上看希爾排序:

就是把數(shù)列進(jìn)行分組(不停使用插入排序),直至從宏觀上看起來(lái)有序,最后插入排序起來(lái)就容易了(無(wú)須多次移位或交換)。

那么,上面那里說(shuō)了將一個(gè)序列分成好幾個(gè)序列,那么到底怎么分呢?比如有10個(gè)元素的序列,分成幾個(gè)才合適?每次縮減又是多少呢?

從專業(yè)的角度上講,將一個(gè)序列分成好幾個(gè)序列,用一個(gè)數(shù)來(lái)表示:那個(gè)數(shù)稱為增量。顯然的是,增量是不斷遞減的(直到增量為1)

往往的:如果一個(gè)數(shù)列有10個(gè)元素,我們第一趟的增量是5,第二趟的增量是2,第三趟的增量是1。如果一個(gè)數(shù)列有18個(gè)嚴(yán)肅,我們第一趟的增量是9,第二趟的增量是4,第三趟的增量是2,第四趟的增量是1

很明顯我們可以用一個(gè)序列來(lái)表示增量:{n/2,(n/2)/2...1},每次增量都/2

二、希爾排序體驗(yàn)

現(xiàn)在我們有一個(gè)數(shù)組,該數(shù)組有6個(gè)元素

      int[] arrays = {2, 5, 1, 3, 4, 6};

排序前:

將該數(shù)組看成三個(gè)(arrays.length/2)數(shù)組,分別是:{2,3},{5,4},{1,6}

第一趟排序:

對(duì)三個(gè)數(shù)組分別進(jìn)行插入排序,因此我們?nèi)齻€(gè)數(shù)組得到的結(jié)果為{2,3},{4,5},{1,6}

此時(shí)數(shù)組是這樣子的:{2, 4, 1, 3, 5, 6}

第二趟排序:

增量減少了,上面增量是3,此時(shí)增量應(yīng)該為1了,因此把{2, 4, 1, 3, 5, 6}看成一個(gè)數(shù)組(從宏觀上是有序的了),對(duì)其進(jìn)行插入排序,直至有序

可能我舉的例子不夠好(沒(méi)看到很好的效果),我們來(lái)看看網(wǎng)上的圖片,加深一下希爾排序的過(guò)程:

PS:圖片來(lái)源網(wǎng)上(侵刪)

三、希爾排序代碼實(shí)現(xiàn)

    public static void shellSort(int[] arrays) {


        //增量每次都/2
        for (int step = arrays.length / 2; step > 0; step /= 2) {

            //從增量那組開始進(jìn)行插入排序,直至完畢
            for (int i = step; i < arrays.length; i++) {

                int j = i;
                int temp = arrays[j];

                // j - step 就是代表與它同組隔壁的元素
                while (j - step >= 0 && arrays[j - step] > temp) {
                    arrays[j] = arrays[j - step];
                    j = j - step;
                }
                arrays[j] = temp;
            }
        }


    }

我們發(fā)現(xiàn)希爾排序代碼其實(shí)非常簡(jiǎn)單(相比對(duì)堆排序),理解起來(lái)也不難,就用增量來(lái)將數(shù)組進(jìn)行分隔,直到增量為1。底層干的還是插入排序干的活~

四、最后

參考資料:

http://blog.csdn.net/jianfpeng241241/article/details/51707618

http://blog.csdn.net/robomaster/article/details/50953265

https://www.cnblogs.com/chengxiao/p/6104371.html

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76359.html

相關(guān)文章

  • 八大基礎(chǔ)排序總結(jié)

    摘要:不斷執(zhí)行這個(gè)操作代碼實(shí)現(xiàn)快速排序用遞歸比較好寫如果不太熟悉遞歸的同學(xué)可到遞歸就這么簡(jiǎn)單。 前言 大概花了一周的時(shí)間把八大基礎(chǔ)排序過(guò)了一遍,這篇博文主要是用來(lái)回顧一下八大基礎(chǔ)排序的要點(diǎn)和一些總結(jié)~ 回顧: 冒泡排序就這么簡(jiǎn)單 選擇排序就這么簡(jiǎn)單 插入排序就這么簡(jiǎn)單 快速排序就這么簡(jiǎn)單 歸并排序就這么簡(jiǎn)單 堆排序就這么簡(jiǎn)單 希爾排序就這么簡(jiǎn)單 基數(shù)排序就這么簡(jiǎn)單 總的來(lái)說(shuō):快速排序是用...

    maochunguang 評(píng)論0 收藏0
  • JS中可能用得到的全部的排序算法

    本篇有7k+字, 系統(tǒng)梳理了js中常見(jiàn)的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復(fù)雜的排序?qū)崿F(xiàn),如果喜歡請(qǐng)點(diǎn)贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導(dǎo)讀 排序算法可以稱得上是我的盲點(diǎn), 曾幾何時(shí)當(dāng)我知道Chrome的Array.prototype.sort使用了快速排序時(shí), 我的內(nèi)心是奔潰的(啥是快排, 我只知道...

    verano 評(píng)論0 收藏0
  • 基本算法學(xué)習(xí)(一)之希爾排序(JS)

    摘要:動(dòng)態(tài)定義間隔序列參考來(lái)源詳細(xì)介紹了十種算法大家可以去學(xué)習(xí)下以后大概會(huì)盡量每天更新一個(gè)算法學(xué)習(xí)吧溫故而知新 參考書:嚴(yán)蔚敏-數(shù)據(jù)結(jié)構(gòu) 希爾排序(Shells Sort) 希爾排序又稱縮小增量排序,歸屬于插入排序一類,簡(jiǎn)單來(lái)說(shuō),和我們的插入排序比,它更快. 奇妙的記憶點(diǎn): 內(nèi)排序(內(nèi)存排序就夠了) 不穩(wěn)定(排序后原始順序無(wú)法保證) 希爾排序重點(diǎn)在于分割. 基本思想: 將整個(gè)待排序記錄序...

    cooxer 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法——希爾、歸并、快速排序

    摘要:今天再來(lái)看看另外三種時(shí)間復(fù)雜度都是的排序算法,分別是希爾排序歸并排序和快速排序。三數(shù)取中法求將放到數(shù)組的末尾總結(jié)這三種排序算法的平均時(shí)間復(fù)雜度都是,歸并排序和快速排序的應(yīng)用更廣泛。 1. 回顧 前面說(shuō)完了三種較為簡(jiǎn)單的排序算法,分別是冒泡排序,選擇排序和插入排序,它們的平均情況時(shí)間復(fù)雜度都是 O(n2),比較的高,適合小規(guī)模的數(shù)據(jù)排序,其中插入排序的效率稍高,所以更推薦使用插入排序。今...

    hersion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<