資料結構-演算法: 插入排序(希爾排序法)

來源:互聯網
上載者:User
希爾排序法基本思想
希爾排序(Shell Sort)又稱為“縮小增量排序”。是1959年由D.L.Shell提出來的。該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
具體做法:首先確定一組增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),對於i=0,1,2,...,t-1,依次進行下面的各趟處理:根據當前增量di將n個元素分成di個組,每組中元素的下標相隔為di;再對各組中元素進行直接插入排序.
2、下面給出希爾排序演算法的執行過程。

(1)採用希爾排序法排序的各趟的結果如下:
初始:503,17,512,908,170,897,275,653,426,154,509,612,677,765,703,94
第1趟{d1=8}:426,17,509,612,170,765,275,94,503,154,512,908,677,897,703,653
第2趟(d2=4):170,17,275,94,426,154,509,612,503,765,512,653,677,897,703,908
第3趟(d3=2):170,17,275,94,426,154,503,612,509,653,512,765,677,897,703,908
第4趟(d1=1):17,94,154,170,275,426,503,509,512,612,653,677,703,765,897,908
(2)例如,n=8,數組a的八個元素分別為:17,3,30,25,14,17,20,9。

給定執行個體的shell排序的排序過程

     假設待排序檔案有10個記錄,其關鍵字分別是:
        49,38,65,97,76,13,27,49,55,04。
     增量序列的取值依次為:
        5,3,1
     排序過程如【動畫類比示範】。

Shell排序的演算法實現

1. 不設監視哨的演算法描述

 

using System;
using System.Collections.Generic;
using System.Text;

namespace ExShellSorter
{
    public class ShellSorter
    {
        public void Sort(int[] arr)
        {
            int inc;
            for (inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ;
            for (; inc > 0; inc /= 3)
            {
                for (int i = inc + 1; i <= arr.Length; i += inc)
                {
                    int t = arr[i - 1];
                    int j = i;
                    while ((j > inc) && (arr[j - inc - 1] > t))
                    {
                        arr[j - 1] = arr[j - inc - 1];//交換資料
                        j -= inc;
                    }
                    arr[j - 1] = t;
                }
            }
        }

        static void Main(string[] args)
        {
            int[] array = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
            ShellSorter s = new ShellSorter();
            s.Sort(array);
            foreach (int m in array)
                Console.WriteLine("{0}", m);

        }
    }
}

  注意:
     當增量d=1時,ShellPass和InsertSort基本一致,只是由於沒有哨兵而在內迴圈中增加了一個迴圈判定條件"j>0",以防下標越界。

2.設監視哨的shell排序演算法
     具體演算法【參考書目[12] 】

演算法分析

1.增量序列的選擇

     Shell排序的執行時間依賴於增量序列。
     好的增量序列的共同特徵:
  ① 最後一個增量必須為1;
  ② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。
     有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。

2.Shell排序的時間效能優於直接插入排序
     希爾排序的時間效能優於直接插入排序的原因:
  ①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。
  ②當n值較小時,n和n2的差別也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(n2)差別不大。
  ③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。
     因此,希爾排序在效率上較直接插人排序有較大的改進。

3.穩定性
     希爾排序是不穩定的。參見上述執行個體,該例中兩個相同關鍵字49在排序前後的相對次序發生了變化。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.