<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 算法原理 > 希爾排序算法是按其設計者希爾(Donald Shell)的名字命名,該算法由1959年公布,是插入排序的一種更高效的改進版本。它的作法不是每次一個元素挨一個元素的比較。而是初期選用大跨步(增量較大)間隔比較,使記錄跳躍式接近它的排序位置;然后增量縮小;最后增量為 1 ,這樣記錄移動次數大大減少,提高了排序效率。希爾排序對增量序列的選擇沒有嚴格規定。 希爾排序是基于插入排序的以下兩點性質而提出改進方法的: * 插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率 * 但插入排序一般來說是低效的, 因為插入排序每次只能將數據移動一位 算法思路: 1. 先取一個正整數 d1(d1?1?個組,所有距離為 d1?的倍數的記錄看成一組,然后在各組內進行插入排序 2. 然后取 d2(d2?1) 3. 重復上述分組和排序操作;直到取 di?= 1(i >= 1) 位置,即所有記錄成為一個組,最后對這個組進行插入排序。一般選 d1?約為 n/2,d2?為 d1?/2, d3?為 d2/2 ,…, di?= 1。 [![圖片來自維基百科](http://bubkoo.qiniudn.com/shell-sort-animation.gif)](https://box.kancloud.cn/2015-07-26_55b4580ee6464.gif "圖片來自維基百科") 圖片來自維基百科 ## 實例分析 假設有數組 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1?= 4,將數組分為 4 組,如下圖中相同顏色代表一組: [![](http://bubkoo.qiniudn.com/shell-sort-step1.1.png)](https://box.kancloud.cn/2015-07-26_55b4581d88661.png) 然后分別對 4 個小組進行插入排序,排序后的結果為: [![](http://bubkoo.qiniudn.com/shell-sort-step1.2.png)](https://box.kancloud.cn/2015-07-26_55b458235dc43.png) 然后,取 d2?= 2,將原數組分為 2 小組,如下圖: [![](http://bubkoo.qiniudn.com/shell-sort-step2.1.png)](https://box.kancloud.cn/2015-07-26_55b45823a848a.png) 然后分別對 2 個小組進行插入排序,排序后的結果為: [![](http://bubkoo.qiniudn.com/shell-sort-step2.2.png)](https://box.kancloud.cn/2015-07-26_55b45832e5d83.png) 最后,取 d3?= 1,進行插入排序后得到最終結果: [![](http://bubkoo.qiniudn.com/shell-sort-step3.png)](https://box.kancloud.cn/2015-07-26_55b458333e848.png) ## JavaScript 語言實現 按照慣例,下面給出了 JavaScript 的算法實現: ~~~ function shellSort(array) { function swap(array, i, k) { var temp = array[i]; array[i] = array[k]; array[k] = temp; } var length = array.length, gap = Math.floor(length / 2); while (gap > 0) { for (var i = gap; i < length; i++) { for (var j = i; 0 < j; j -= gap) { if (array[j - gap] > array[j]) { swap(array, j - gap, j); } else { break; } } } gap = Math.floor(gap / 2); } return array; } ~~~ ## 參考文章 * [維基百科,自由的百科全書](http://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F) * [希爾排序基本思想](http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.2.1.htm) * [[演算法] 希爾排序法(Shell Sort)](http://notepad.yehyeh.net/Content/Algorithm/Sort/Shell/Shell.php) * [算法系列15天速成——第三天 七大經典排序【下】](http://www.cnblogs.com/huangxincheng/archive/2011/11/20/2255695.html) * [Algorithm Implementation/Sorting/Shell sort](http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Shell_sort)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看