使用Go語言實現基數排序


在這篇文章中,我們將瞭解如何使用最低有效位和最高有效位來實現基數排序。基數排序是一種排序演算法,它透過根據元素的個位數字或數字位置對元素進行分組來進行排序。它是一種線性時間排序演算法,時間複雜度為O(nk)。

使用最低有效位

在這種方法中,我們將編寫一個Go語言程式,使用最低有效位來實現基數排序。LSD 從右到左對元素進行排序,比較它們的個位數字。

演算法

  • 步驟 1 − 首先,我們需要匯入fmt包。然後建立一個名為radixSortMSD()的函式來對陣列進行排序。

  • 步驟 2 − 在函式內部建立一個新陣列。使用for迴圈迭代陣列,並將陣列的最大元素儲存在一個變數中。

  • 步驟 3 − 現在,初始化一個計數陣列來跟蹤具有特定數字的元素數量。

  • 步驟 4 − 遍歷陣列併為每個元素的對應數字遞增計數。

  • 步驟 5 − 修改計數陣列以儲存每個元素在輸出陣列中的實際位置。按照計數陣列指定的順序將元素從輸入陣列複製到輸出陣列。

  • 步驟 6 − 將輸入陣列更新為排序後的輸出陣列並返回排序後的陣列。

  • 步驟 7 − 啟動main()函式。在main()內部初始化一個數組並向其儲存值。此外,呼叫radixSort()函式並將陣列作為引數傳遞給函式。

  • 步驟 8 − 將函式獲得的結果儲存在一個變數中,並在螢幕上列印。

示例

下面的示例演示瞭如何開發一個Go語言程式,使用最低有效位來實現基數排序。

package main

import "fmt"

func radixSortLSD(arr []int) []int {
   max := arr[0]
   for i := 1; i < len(arr); i++ {
      if arr[i] > max {
         max = arr[i]
      }
   }
   exp := 1
   for max/exp > 0 {
      count := make([]int, 10)
      for i := 0; i < len(arr); i++ {
         count[(arr[i]/exp)%10]++
      }
      for i := 1; i < 10; i++ {
         count[i] += count[i-1]
      }
      Output := make([]int, len(arr))
      for i := len(arr) - 1; i >= 0; i-- {
         Output[count[(arr[i]/exp)%10]-1] = arr[i]
         count[(arr[i]/exp)%10]--
      }
      for i := 0; i < len(arr); i++ {
         arr[i] = Output[i]
      }
      exp *= 10
   }
   return arr
}

func main() {
   arr := []int{15, 31, 42, 20, 9}
   fmt.Println("The unsorted array is:", arr)
   result := radixSortLSD(arr)
   fmt.Println("The sorted array is:", result)
}

輸出

The unsorted array is: [15 31 42 20 9]
The sorted array is: [9 15 20 31 42]

使用最高有效位

在這種方法中,我們將編寫一個Go語言程式,使用以下語法透過最高有效位使用基數排序來對陣列進行排序。

語法

func len(v Type) int

len()函式用於獲取任何引數的長度。它接受一個引數作為我們希望查詢其長度的資料型別變數,並返回一個整數作為變數的長度。

演算法

  • 步驟 1 − 首先,我們需要匯入fmt包。然後我們建立了兩個名為radixSortMSD()和radixSortMSDHelper()的函式。

  • 步驟 2 − radixSort()函式接受要排序的陣列作為引數,並返回排序後的陣列。該函式呼叫radixSortMSDHelper()函式。

  • 步驟 3 − radixSortMSDHelper()函式接受要排序的陣列以及陣列的最大元素作為引數。

  • 步驟 4 − 該函式將排序後的陣列返回給radixSort()函式,radixSort()函式最終將陣列返回給程式的main()部分。

  • 步驟 5 − 現在,啟動main()函式。在main()內部初始化要排序的陣列併為其賦值。

  • 步驟 6 − 透過將陣列作為引數傳遞給函式來進一步呼叫radixSortMSD()函式,並將結果儲存在一個單獨的變數中。

  • 步驟 7 − 現在,使用fmt.Println()函式在螢幕上列印最終陣列。

示例

在下面的示例中,我們將學習如何開發一個Go語言程式,使用最高有效位來實現基數排序。

package main

import "fmt"

func radixSortMSD(arr []int) []int {
   max := arr[0]
   for i := 1; i < len(arr); i++ {
      if arr[i] > max {
         max = arr[i]
      }
   }
   arr = radixSortMSDHelper(arr, max)
   return arr
}

func radixSortMSDHelper(arr []int, exp int) []int {
   if exp <= 0 {
      return arr
   }
   count := make([]int, 10)
   for i := 0; i < len(arr); i++ {
      count[(arr[i]/exp)%10]++
   }
   for i := 1; i < 10; i++ {
      count[i] += count[i-1]
   }
   Output := make([]int, len(arr))
   for i := len(arr) - 1; i >= 0; i-- {
      Output[count[(arr[i]/exp)%10]-1] = arr[i]
      count[(arr[i]/exp)%10]--
   }
   subarrays := make([][]int, 10)
   for i := 0; i < len(Output); i++ {
      subarrays[(Output[i]/exp)%10] = append(subarrays[(Output[i]/exp)%10], Output[i])
   }
   result := make([]int, 0)
   for i := 0; i < 10; i++ {
      if len(subarrays[i]) > 0 {
         subarrays[i] = radixSortMSDHelper(subarrays[i], exp/10)
         result = append(result, subarrays[i]...)
      }
   }
   return result
}

func main() {
   arr := []int{5, 3, 2, 15, 9}
   fmt.Println("The unsorted array is:", arr)
   result := radixSortMSD(arr)
   fmt.Println("The sorted array is:", result)
}

輸出

The unsorted array is: [5 3 2 15 9]
The sorted array is: [2 3 5 9 15]

結論

我們已經成功編譯並執行了一個Go語言程式,使用基數排序演算法對陣列進行排序。這裡我們實現了兩個示例。在第一個示例中,我們透過最低有效位對陣列進行排序,而在第二個示例中,我們透過最高有效位對陣列進行排序。兩種方法的時間複雜度均為O(nk)。

更新於:2023年4月5日

瀏覽量:362

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.