1. 程式人生 > >[數據結構] 幾種排序算法

[數據結構] 幾種排序算法

記錄 新的 post span 原來 .... 排序 eight 開始

  插入排序

  直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的元素,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到全部記錄插入完成為止。

  設數組為a[0…n-1]。

  1. 初始時,a[0]自成1個有序區,無序區為a[1..n-1]。令i=1

  2. 將a[i]並入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。

  3. i++並重復第二步直到i==n-1。排序完成。

  希爾排序

  希爾排序的實質就是分組插入排序。

  該方法的基本思想是:先將整個待排元素序列分割成若幹個子序列(由序號相差某個“增量”的元素組成的),分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的。

  一般我們進行希爾排序時,會取增量gap=數組長度/2,每完成一次這個gap下分組的直接插入排序後,將gap再次除以2得到新的gap。例子如下:

  { 49,38,65,97,26,13,27,49,55,4 },這是一個長度n=10的數組,我們對它進行從小到大的排序

  ① gap = 10/2 = 5,

技術分享圖片

  1A,1B為一組,2A,2B為一組......我們將數據分成了五組:{ 49,13 },{ 38,27 },{ 65,49 },{ 97,55 },{ 26,4 }。我們對這五組數據分別進行插入排序,得到了{ 13,49 },{ 27,48 },{ 49,65 },{ 55,97 },{ 4,26 },放回原來的數組,我們開始第二次:

  ② gap = 5/2 = 2,

    技術分享圖片

  我們得到了{ 13,49,4,38,97},{ 27,55,49,65,26 }。將這兩組數據再一次進行插入排序我們得到 { 4,13,38,49,97 },{ 26,27,49,55,65 },保持他們在原數組中的位置,我們開始第三次:

  ③ gap = 2/2 = 1,

  技術分享圖片

  這一次我們得到 { 4,26,13,27,38,49,49,55,97,65 },再進行插入排序得到 { 4,13,26,27,38,49,49,55,65,97 },最後我們得到了完成排序的數組:

  ④ gap = 1/2 = 0:

  技術分享圖片

  快速排序

  堆排序

  二路歸並排序

  基數排序

  排序算法間的比較

[數據結構] 幾種排序算法