常見排序演算法的golang 實現
阿新 • • 發佈:2022-05-17
五種基礎排序演算法對比
1:氣泡排序
演算法描述
比較相鄰的元素。如果第一個比第二個大,就交換它們兩個; 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數; 針對所有的元素重複以上的步驟,除了最後一個; 重複步驟1~3,直到排序完成。
動圖演示
程式碼演示
func bubbleSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for e := len(arr) - 1; e > 0; e-- {
for i := 0; i < e; i++ {
if arr[i] > arr[i+1] {
Swap(arr, i, i+1) //交換元素
}
}
}
return arr
}
func Swap(arr []int, i, j int) []int {
temp := arr[j]
arr[j] = arr[i]
arr[i] = temp
return arr
}
2:選擇排序
演算法描述
n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體演算法描述如下:
將假想牆放置在數字列表最左側,牆的左側為已排序子列表,右側為未排序子列表; 找出(選擇)未排序子列表中的最小(或最大)元素; 把選擇的元素與未排序列表中第一個元素進行交換; 將假想牆向右移動一個位置; 反覆執行 2 至 4 步操作,直至整個數字列表排序完成(需要 n - 1 輪)。
動圖演示
程式碼演示
func selectSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for i := 0; i < len(arr); i++ {
var minIndex int = i
for j := i + 1; j < len(arr); j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
arr = Swap(arr, i, minIndex)
}
return arr
}
3:插入排序
演算法描述
一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:
從第一個元素開始,該元素可以認為已經被排序; 取出下一個元素,在已經排序的元素序列中從後向前掃描; 如果該元素(已排序)大於新元素,將該元素移到下一位置; 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置; 將新元素插入到該位置後; 重複步驟2~5。
動圖演示
程式碼實現
func insertSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for i := 1; i < len(arr); i++ {
for j := i - 1; j >= 0; j-- {
if arr[j] > arr[j+1] {
Swap(arr, j, j+1)
}
}
}
return arr
}
4:快速排序
演算法描述
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
從數列中挑出一個元素,稱為 “基準”(pivot); 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作; 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
動圖演示
程式碼實現
//快速排序
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
middle := arr[0]
var left []int
var right []int
for i := 1; i < len(arr); i++ {
if arr[i] > middle {
right = append(right, arr[i])
} else {
left = append(left, arr[i])
}
}
middle_s := []int{middle}
left = quickSort(left)
right = quickSort(right)
arr = append(append(left, middle_s...), right...)
return arr
}