首頁 > 軟體

Go語言資料結構之希爾排序範例詳解

2022-08-26 18:04:15

希爾排序

在插入排序中,在待排序序列的記錄個數比較少,而且基本有序,則排序的效率較高。

1959 年,Donald Shell 從“減少記錄個數” 和 “基本有序” 兩個方面對直接插入排序進行了改進,提出了希爾排序演演算法。

希爾排序又稱為“縮小增量排序”。即將待排序記錄按下標的一定增量分組(減少記錄個數),對每組記錄使用直接插入排序演演算法排序(達到基本有序);

隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1,整個序列基本有序,再對全部記錄進行一次直接插入排序。

演演算法思想

Shell 排序是一種高效的排序演演算法,基於插入排序演演算法。這種演演算法避免了插入排序中的大量移動,如果較小的值在最右邊,就必須移到最左邊。較小的值在最右邊,必須移到最左邊。

演演算法步驟:

  • 設待排序的記錄儲存在陣列 array[1...n]  中,增量序列為 {g1, g2, ..., gt}  , n>g1>g2>...>gt=1 。
  • 第一趟增量 g1, 所有間隔為 g1 的記錄分在一組,對每組記錄進行插入排序。
  • 第二趟取增量 g2,所有間隔為 g2 的記錄分在一組,對每組記錄進行插入排序。
  • 依次進行下去,直到所取增量 gt = 1,所有記錄在一組中進行插入排序。

圖解演演算法

假設我們有一個陣列: [7, 4, 3, 5, 2, 1, 6] :

第一次希爾排序間隔為3時:

第二次希爾排序間隔為2時:

第三次希爾排序間隔為1時:

Go 程式碼實現:

package main
import "fmt"
func swap(array []int, a int, b int) {
    array[a] = array[a] + array[b]
    array[b] = array[a] - array[b]
    array[a] = array[a] - array[b]
}
func shellSort(array []int, length int) {
    for gap := length / 2; gap > 0; gap = gap / 2 {
        for i := gap; i < length; i++ {
            var j = i
            for {
                if j-gap < 0 || array[j] >= array[j-gap] {
                    break
                }
                swap(array, j, j-gap)
                j = j - gap
            }
        }
    }
}
func main() {
    nums := []int{7, 4, 3, 5, 2, 1, 6}
    length := len(nums)
    shellSort(nums, length)
    for i := 0; i < length; i++ {
        fmt.Println(nums[i])
    }
}

執行結果:

[Running] go run "e:Coding WorkspacesLearningGoTheEasiestWayGo 資料結構希爾排序main.go"
1
2
3
4
5
6
7

總結

空間複雜度: 希爾排序在分組進行插入排序時使用了一個輔助空間 j,空間複雜度為 O(1)O(1)O(1)

穩定性: 希爾排序的分組導致不同組間的相同數位可能會調換位置,所以希爾排序是不穩定的排序演演算法。

以上就是Go語言資料結構之希爾排序範例詳解的詳細內容,更多關於Go 資料結構希爾排序的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com