日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

八大排序算法詳解——希爾排序

2019-11-10 19:50:48
字體:
來源:轉載
供稿:網友

基本思想

先取一個小于n的整數d1作為第一個增量,把待排序的全部記錄分成dx個組。所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插人排序。然后,取第二個增量d2<d1重復上述的分組和排序。直至所取的增量dt=1(dt<dt-x<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。

算法實現

希爾排序算法,java實現,代碼如下所示:

public abstract class Sorter { public abstract void sort(int[] array); } public class ShellSorter extends Sorter { @Override public void sort(int[] array) { int d = array.length; do { d /= 2; shellPass(array, d); // 根據逐漸減小的間隔增量,循環調用一趟排序 } while (d > 1); } /** * 希爾一趟排序 * @param d 間隔增量 */ PRivate void shellPass(int[] array, int d) { Integer tmp; for (int i = d; i < array.length; i++) { // 數組下標從0開始,初始i=d表示一趟排序中第二個元素 tmp = array[i]; // array[i]的拷貝 // 如果待處理的無序區第一個元素array[i] < 有序區最大的元素array[i-d] // 需要將有序區比array[i]大的元素向后移動 if (array[i] < array[i - d]) { int j = i - d; while (j >= 0 && tmp < array[j]) { array[j + d] = array[j]; // 將左側有序區中元素比array[i]大的array[j+d]后移 j -= d; } // 如果array[i] >= 左側有序區最大的array[i-d],或者經過掃描移動后,找到一個比array[i]小的元素 // 將右側無序區第一個元素tmp = array[i]放到正確的位置上 array[j + d] = tmp; } } } }

排序過程

希爾排序的過程如下:

首先初始化間隔d為待排序數組的長度,無需排序。減小d,對于每次得到的間隔d,執行多組排序,使得原始數組間隔為d的一個子數組為有序,該數組通過類似直接插入排序的算法來執行排序。直到,d減小為1的時候,整個數組為有序。這里,采用二分的策略來得到間隔d。

下面通過例子來說明,執行希爾排序的過程,如下所示:假設待排序數組為array = {94,12,34,76,26,9,0,37,55,76,37,5,68,83,90,37,12,65,76,49},數組大小為20。整個排序過程的分組情況,如下所示:

1{94,12,34,76,26,9,0,37,55,76,37,5,68,83,90,37,12,65,76,49}
2{37,5,34,76,26,9,0,37,55,49,    94,12,68,83,90,37,12,65,76,76}
3{9,0,34,55,26,    37,5,37,76,49,    37,12,65,76,76,    94,12,68,83,90}
4{5,0,    9,12,12,    37,26,    37,34,49,    37,55,    65,68,76,    76,76,    90,83,94}
5{0,    5,    9,    12,12,    26,    34,    37,    37,37,    49,    55,    65,    68,76,    76,    76,    83,    90,94}

下面說明詳細過程:首先,初始化d = 20。在循環中反復得到間隔d,根據d執行一趟希爾排序。

對于d = 20/2 = 10:

根據d = 10來對數組排序,將原始數組分成2塊: {94,12,34,76,26,9,0,37,55,76}與{37,5,68,83,90,37,12,65,76,49},也就是對如下數組分別進行直接插入排序:{array[0],array[10]} = {94,37}{array[1],array[11]} = {12,5}{array[2],array[12]} = {34,68}{array[3],array[13]} = {76,83}{array[4],array[14]} = {26,90}{array[5],array[15]} = {9,37}{array[6],array[16]} = {0,12}{array[7],array[17]} = {37,65}{array[8],array[18]} = {55,76}{array[9],array[19]} = {76,49}第一趟希爾排序后,各個子數組變為:{37,5,34,76,26,9,0,37,55,49}與{94,12,68,83,90,37,12,65,76,76},即:array = {37,5,34,76,26,9,0,37,55,49,94,12,68,83,90,37,12,65,76,76},

對于d = 10/2 = 5:

根據d = 5來對數組排序,將第一趟希爾排序后的數組分成4塊 :{37,5,34,76,26}、{9,0,37,55,49}、{94,12,68,83,90}與{37,12,65,76,76},也就是對如下數組分別進行直接插入排序:{array[0],array[5],array[10],array[15]} = {37,9,94,37}{array[1],array[6],array[11],array[16]} = {5,0,12,12}{array[2],array[7],array[12],array[17]} = {34,37,68,65}{array[3],array[8],array[13],array[18]} = {76,55,83,76}{array[4],array[9],array[14],array[19]} = {26,49,90,76}第二趟希爾排序后,各個子數組變為:{9,0,34,55,26}、{37,5,37,76,49}、{37,12,65,76,76}與{94,12,68,83,90},即:array = {9,0,34,55,26,37,5,37,76,49,37,12,65,76,76,94,12,68,83,90}。

對于d = 5/2 = 2:

根據d = 2來對數組排序,將第二趟希爾排序后的數組分成10塊: {9,0}、{34,55}、{26,37}、{5,37}、{76,49}、{37,12}、{65,76}、{76,94}、{12,68}與{83,90},也就是對如下數組分別進行直接插入排序:{array[0],array[2],array[4],array[6],array[8],array[10],array[12],array[14],array[16],array[18]} = {9,34,26,5,76,37,65,76,12,83}{array[1],array[3],array[5],array[7],array[9],array[11],array[13],array[15],array[17],array[19]} = {0,55,37,37,49,12,76,94,68,90}第三趟希爾排序后,各個子數組變為:{5,0}、{9,12}、{12,37}、{26,37}、{34,49}、{37,55}、{65,68}、{76,76}、{76,90}與{83,94},即:array = :{5,0,9,12,12,37,26,37,34,49,37,55,65,68,76,76,76,90,83,94}。

對于d = 2/2 = 1:

根據d = 1來對數組排序,將第二趟希爾排序后的數組分成20塊:{5}、{0}、{9}、{12}、{12}、{37}、{26}、{37}、{34}、{49}、{37}、{55}、{65}、{68}、{76}、{76}、{76}、{90}、{83}、{94},也就是對如下數組分別進行直接插入排序:{5,0,9,12,12,37,26,37,34,49,37,55,65,68,76,76,76,90,83,94}第四趟希爾排序以后,數組已經有序:array = {0,5,9,12,12,26,34,37,37,37,49,55,65,68,76,76,76,83,90,94}。因為 d= 1,希爾排序結束。

算法分析

希爾排序是基于插入排序的一種算法, 它的時間復雜度與增量序列的選取有關,例如:

希爾提出了增量序列 h1 ,h2 ,……,ht ,只要h1=1,任何增量序列都是可行的,使用希爾增量排序的時間復雜度為O(n^2)。Hibbard提出了一個增量序列:2^k-1,使用Hibbard增量排序的時間復雜度為O(n^(3/2))。Sedgewick提出了幾種增量序列:9*4i – 9*2i +1 或者是 4i – 3* 2i + 1,最壞運行時間為O(n^(4/3)),對這些增量序列的平均運行時間猜測為O(n^(7/6))。

但是現今仍然沒有人能找出希爾排序的精確下界。希爾排序沒有快速排序算法快O(nlogn),因此中等大小規模表現良好,對規模非常大的數據排序不是最優選擇。但是比O(n^2)復雜度的算法快得多。此外,希爾算法在最壞的情況下和平均情況下執行效率相差不是很多,與此同時快速排序在最壞的情況下執行的效率會非常差。專家們提倡,幾乎任何排序工作在開始時都可以用希爾排序,若在實際使用中證明它不夠快,再改成快速排序這樣更高級的排序算法。本質上講,希爾排序算法是直接插入排序算法的一種改進,減少了其復制的次數,速度要快很多,原因是,當n值很大時數據項每一趟排序需要的個數很少,但數據項的距離很長。當n值減小時每一趟需要和動的數據增多,此時已經接近于它們排序后的最終位置。 正是這兩種情況的結合才使希爾排序效率比插入排序高很多。

時間復雜度

希爾排序的效率很大程度上依賴于增量序列的選擇,好的增量序列有如下共同特征:

最后一個增量必須為1。應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

有人通過大量的實驗,給出了較好的結果:當n較大時,比較和移動的次數約在n^1.25到1.6*n^1.25之間。另外,希爾排序的時間性能優于直接插入排序,原因是:

當文件初態基本有序時直接插入排序所需的比較和移動次數均較少。當n值較小時,n和的差別也較小,即直接插入排序的最好時間復雜度O(n)和最壞時間復雜度0()差別不大。在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,后來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由于已經按di-1作為距離排過序,使文件較接近于有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插入排序有較大的改進。

空間復雜度

因為希爾排序依賴于增量序列,從而導致排序的趟數不固定,對于不同的增量執行一趟希爾排序,只用到一個輔助變量,所以空間復雜度為O(n)。

排序穩定性

由于多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最后其穩定性就會被打亂,通過上述元素76可以看到,希爾排序不穩定。

因此,希爾排序是不穩定的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
91精品免费看| 91精品国产综合久久久久久| 成人一区二区不卡免费| 国产在线视频一区二区| 国产视频1区| 亚洲国产无线乱码在线观看| 一区在线播放视频| 欧美日韩精品在线视频| 久久久99精品久久| 欧美日韩精品是欧美日韩精品| 国产成人精品综合网站| 国产永久在线观看| 91九色在线看| 国产免费电影网站入口| 欧美三级网址| 亚洲三级av| 欧美不卡视频一区发布| 精品国产91| 日韩欧美国产午夜精品| 在线看的av| 日韩视频精品在线| 亚洲高清在线观看一区| 日韩免费高清一区二区| 日韩亚洲欧美中文高清在线| 欧美日韩精品免费在线观看视频 | 中文字幕精品国产| 粉嫩粉嫩芽的虎白女18在线视频| a在线观看免费视频| 亚洲 欧美 中文字幕| 免费在线国产| 国产成人精品免费网站| 日韩精品在线免费观看视频| 91精品国产91久久久久久三级| 国产乱码午夜在线视频| 999精品在线| 国产欧美日韩在线播放| 国产福利三区| 日韩中文字幕| 中文字幕在线观看网址| 国产美女主播视频一区| 亚洲制服丝袜一区| 欧美日韩综合在线免费观看| 国产永久在线观看| 欧美日中文字幕| 欧美激情一区二区三区在线| 深夜福利一区| 国产 欧美 在线| 欧美日韩国产一区在线| 国产日韩免费| 深夜福利一区二区| 日韩在线观看视频一区二区| 国产自产视频| 中文天堂资源在线| 国产欧美中文在线| av亚洲免费| 欧美亚洲另类制服自拍| 日韩va亚洲va欧洲va国产| 免费视频久久| 日韩在线二区| 国产一卡2卡3卡四卡网站| 精品人妻二区中文字幕| 在线一区av| 999精品网| 欧美日本精品在线| 久久永久免费视频| 中文欧美日韩| 日韩久久不卡| 国产超级va在线视频| 日韩欧美在线视频日韩欧美在线视频| 日韩精品a在线观看91| 日韩视频中文字幕| 又黄又www的网站| 1区2区3区在线视频| 久久精品一二三| 日韩欧美色综合网站| 日本亚洲视频在线| 国产黄色在线网站| 国产一卡二卡3卡4卡四卡在线| 国产乱国产乱老熟300| 日韩欧美中文视频| 国产黄在线观看免费观看不卡| 日本熟女一区二区| 久草视频观看| 麻豆精品99| 欧美日韩国产中文精品字幕自在自线 | 99久久婷婷| 国产欧美日韩不卡| 日韩一级在线视频| 日韩国产成人精品| 日韩视频 中文字幕| 日韩亚洲一区中文字幕| 麻豆精品视频入口| 国产成人精品综合久久久| 亚洲视频日韩| 在线视频不卡国产V| 999精品网| 欧美日韩精品免费在线观看视频| 不卡一区2区| 欧美婷婷久久| 亚洲成在线观看| av午夜在线| 国产在线精品日韩| 欧美日韩视频在线| 日韩欧美中文第一页| 成人ww免费完整版在线观看| 久久99精品国产| 91精品国产调教在线观看| 91精品视频在线| 欧美日韩一级视频| 日韩精品国产欧美| 欧美高清一区| 婷婷综合福利| 正在播放日韩精品| 国产福利免费观看| www.三级.com| 国产高清一级片| 国产一二三四| 亚洲一级二级| 欧美日韩国产综合网| 国产羞羞视频在线播放| 亚洲视频一二三四| 日韩欧美看国产| 在线欧美日韩国产| 日韩av一区在线| 欧美日韩精品在线视频| 色猫猫国产区一区二在线视频 | 日韩欧美在线网址| 精品国产欧美| 中文字幕一区不卡| 日韩视频第二页| 国产绿帽一区二区三区| 天堂在线视频中文网| 91精品国产自产在线丝袜啪| 日韩在线视频精品| 亚洲免费中文字幕| 国产成人精品999| 人成在线免费视频| 欧美日韩日本视频| 国产蜜臀在线| 亚洲福利一区二区三区| 亚洲高清精品视频| 日韩欧美国产三级| 国产成人综合精品| 日韩在线视频精品| 日韩一二三四区| 黄色在线播放网站| 欧美日韩在线第一页| av最新网址| 久久99蜜桃精品| 日本亚洲欧美| 欧美日韩精品欧美日韩精品一| 日本不卡免费高清视频| 欧美综合精品| 国产91大片| 91麻豆免费视频网站| 欧美日韩亚洲不卡| 精品全国在线一区二区| 色一区在线观看| 亚洲一级网站| 日韩欧美成人一区二区三区| 欧美日韩亚洲综合| 日韩高清不卡在线| 一区二区三区视频网站 | 中文不卡在线| 天天综合天天做| 深夜福利一区二区| 日韩欧美国产网站| 精品播放一区二区| 欧美日韩一区二区在线视频| 亚洲第一香蕉网| 在线精品日韩| 欧美日韩三级一区| 91精品国产综合久久精品app| 中文字幕欧美国内| 国产欧美三级| 日韩欧美一级二级三级久久久| 国产黄色高清在线| 欧美三级中文字幕在线观看| 欧美日韩亚州综合| 日韩欧美一级精品久久| 亚洲国产无线乱码在线观看| 国产中文在线视频| 久久久91精品| 国产精品一区二三区| 内射国产内射夫妻免费频道| 欧美日韩三级一区| 日韩欧美中文| 香蕉视频亚洲一级| 91精品国产91久久久久青草| 樱花草www在线| 日韩欧美色综合网站| 日韩国产一区三区| 欧美日韩国产系列| 国产九九在线| 日本黄色一区二区| 欧美专区中文字幕| 日韩字幕在线观看| 红桃视频国产一区| 欧美另类久久久品| 青青久在线视频免费观看| 91蜜桃在线视频| 欧美日韩亚洲综合| 91麻豆免费视频网站| 免费视频中文字幕| 国产婷婷色一区二区三区在线| 欧美日韩第一区日日骚| 欧美亚洲天堂| 国产高清不卡av| 精品久久九九| 一区精品在线播放| 国产最新在线| 色屁屁一区二区| 欧美日韩在线精品成人综合网| 中文字幕日韩在线观看| 中文字幕精品一区二| 日韩精品在线观看视频| 免费精品国产自产拍在| 国产福利久久| 中文天堂在线一区| 国产网站欧美日韩免费精品在线观看| 日韩中文在线视频| 91欧美日韩在线| 国产wwww| 国产一级片在线| 久久99精品久久久久久青青日本| 亚洲欧美伊人| 蜜桃精品在线| 国产69精品久久久久孕妇国产69久久| 精品无人国产偷自产在线| 在线视频日韩欧美| 欧美日韩视频免费| 欧美日韩国产综合久久 | 国产高清视频一区二区| www.老鸭窝.com| 精品一区二区在线观看视频| 亚洲娇小xxxx欧美娇小| 日韩国产专区| 亚洲欧美日本国产专区一区| 1区2区在线| 91一区二区| 蜜桃精品在线| 国产网站欧美日韩免费精品在线观看 | 亚洲一区日韩在线| 天堂在线中文资源| 日本熟女一区二区| 日韩欧美综合视频| va中文字幕| 国产欧美日韩在线| 日韩三级在线播放| 中文天堂资源在线| 日韩欧美资源站| 精品视频资源站| 中文字幕精品视频在线| 久草视频在线看| 日韩av中文字幕一区| 日韩在线视频一区二区三区| 欧美乱大交xxxxx另类| 久久精品黄色片| 国产日产一区二区| 国产资源在线观看入口av| 日韩影院二区| 欧美日韩中文国产| 在线视频三区| 一本一道综合狠狠老| 日韩久久在线| 日韩欧美综合| 一区在线播放视频| av免费在线不卡| 日韩国产欧美三级| 日韩欧美99| 精品日韩av| 亚洲黄色片在线观看| 精品人妻一区二区免费视频 | 亚洲女同中文字幕| 亚洲欧美中文字幕在线一区| 欧美日韩国产首页| 欧美日韩国产免费观看视频| 欧美日韩高清一区二区| 日韩精品乱码av一区二区| 国产区日韩欧美| 91久久精品网| 欧美国产91| 国产在线黄色| 欧美三级中文字幕在线观看| 综合图区亚洲白拍在线| 日韩视频在线观看视频| 国产欧美自拍一区| 在线观看中文字幕一区| 欧美日韩国产影片| 精品婷婷伊人一区三区三| 日韩欧美中文字幕精品| 日韩在线一区二区视频| 国产日韩中文在线| 国产成人综合精品| 亚洲女人天堂色在线7777| 国产h片在线观看| 久久香蕉av| 亚洲 欧美 日韩系列| 日韩中文字幕第一页| 国产欧美日韩中文久久| 日韩精品视频在线看| 91久久精品网| 欧美日韩久久不卡| 欧美日韩国产综合久久| 日韩在线视频在线观看| 热久久精品国产| 在线观看国产一级片| www.尤物.com| 91精品国产自产在线观看永久∴ | 日韩欧美视频一区二区三区四区| 欧美三级日韩在线| 最近中文字幕第一页| 日韩av不卡在线观看| 精品日韩在线观看| 日本不卡免费高清视频| 国产婷婷在线观看| 日韩国产一区| 欧美一卡2卡三卡4卡5免费| 欧美日韩国产第一页| 天天综合天天做| 99视频精品全国免费| 久久99精品久久久久婷婷| 91精品国产综合久久久久久漫画| 日韩中文字幕在线视频观看| 91亚洲欧美| 色国产在线视频| 日韩精品在线私人| 成人一区二区不卡免费| 在线看欧美日韩| a√免费观看在线网址www| 日韩欧美一级精品久久| 二区视频在线观看| 日韩精品在线看| 国产欧美久久久精品免费| 亚洲欧洲日韩精品在线| 午夜国产在线| 亚洲黄色一区二区| 精品久久久视频| 日韩在线精品| 国产1区在线| 欧美日韩中文字幕视频| 国产一区 二区 三区一级| 国产www.大片在线| 欧美高清一级片在线| 红桃视频亚洲| av高清一区| 日韩影院二区| 国产无遮挡在线视频免费观看| 在线看欧美日韩| 久久精品女人| 最近中文字幕日韩精品| 区日韩二区欧美三区| 一区二区视频国产| 欧美日韩国产在线| 欧美日韩三级在线| 欧美日韩精品欧美日韩精品一| 中文字幕欧美日韩va免费视频| 69av亚洲| 亚洲а∨精品天堂在线| 亚洲三级中文字幕| 中文字幕精品一区二区三区在线| 91精品视频播放| 99久久精品国产亚洲| 久久99久久99精品中文字幕| 亚洲一区精品电影| 国产中文在线视频| 成年人黄国产| 中文字幕在线精品| 欧美不卡视频一区| 中文字幕精品在线播放| 日韩久久不卡| 在线亚洲人成| aaa欧美日韩| 一区二区三区久久| 国产黄在线看| 日韩视频在线一区二区三区| 精品一二线国产| 欧美日韩在线中文字幕| 你懂的亚洲视频| 成人h视频在线观看| 午夜精品一区二区三区视频免费看| 中文网丁香综合网| 日韩在线视频精品| 中文字幕精品在线播放| 国产中文在线视频| 国产日韩av一区二区| 亚洲 欧美 日韩系列| 亚洲欧洲日产国码av系列天堂| 国产欧美综合在线观看第十页| 国产视频不卡| 国产在线欧美| 黄色一区二区视频| 日韩三级高清在线| 伊人亚洲视频| 欧美三级日本三级少妇99| 亚洲一区中文| 最新中文在线视频| 国产黄色在线免费观看| 欧美中文字幕第一页| 韩国av一区二区|