如何在Go語言中穩定排序切片?


在Go語言中對資料切片進行排序時,有時保持具有相同排序鍵的元素的原始順序非常重要。這就是穩定排序發揮作用的地方。穩定排序演算法確保具有相同排序鍵的元素的順序在排序後保持不變。Go提供了一個內建的sort包,其中包含一個穩定的排序演算法。在本文中,我們將討論如何在Go語言中穩定地對切片進行排序。

Go語言中的sort包提供了兩種用於排序切片的函式:sort.Slice()和sort.SliceStable()。sort.Slice()函式根據定義排序順序的less函式對值切片進行排序。另一方面,sort.SliceStable()函式根據定義排序順序的less函式對值切片進行排序,並保持具有相同排序鍵的元素的原始順序。

示例

以下是如何使用sort.SliceStable()穩定地對整數切片進行排序的示例:

package main

import (
   "fmt"
   "sort"
)

func main() {
   nums := []int{5, 2, 8, 2, 9, 3}
   fmt.Println("Original slice:", nums)
   
   sort.SliceStable(nums, func(i, j int) bool {
      return nums[i] < nums[j]
   })
   
   fmt.Println("Sorted slice:", nums)
}

輸出

Original slice: [5 2 8 2 9 3]
Sorted slice: [2 2 3 5 8 9]

在上面的示例中,我們建立一個整數切片並打印出原始切片。然後,我們使用sort.SliceStable()函式和一個自定義的less函式(比較切片的第i個和第j個元素)來穩定地按升序對切片進行排序。

示例

以下是如何使用sort.SliceStable()穩定地對字串值切片進行排序的另一個示例:

package main

import (
   "fmt"
   "sort"
)

func main() {
   names := []string{"Alice", "Bob", "Charlie", "David", "Bob", "Charlie"}
   fmt.Println("Original slice:", names)

   sort.SliceStable(names, func(i, j int) bool {
      return names[i] < names[j]
   })

   fmt.Println("Sorted slice:", names)
}

輸出

Original slice: [Alice Bob Charlie David Bob Charlie]
Sorted slice: [Alice Bob Bob Charlie Charlie David]

在上面的示例中,我們建立一個字串值切片並打印出原始切片。然後,我們使用sort.SliceStable()函式和一個自定義的less函式(比較切片的第i個和第j個元素)來穩定地按升序對切片進行排序。

結論

當您需要保持具有相同排序鍵的元素的原始順序時,穩定地對切片進行排序非常重要。Go提供了一個內建的sort包,其中包含一個穩定的排序演算法。透過使用sort.SliceStable()函式和一個自定義的less函式,您可以穩定地對Go語言中的切片進行排序。

更新於:2023年4月25日

942 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.