基于Go語言實現(xiàn)選擇排序算法及優(yōu)化
選擇排序
選擇排序是一種簡單的比較排序算法,它的算法思路是首先從數(shù)組中尋找最小(大)的元素,然后放到數(shù)組中的第一位,接下來繼續(xù)從未排序的元素中尋找最?。ù螅┰?,然后放到已排序元素的末尾,依次類推,直到所有元素被排序。
圖片演示
普通算法
import "fmt" func main() { nums := [8]int{8, 2, 3, 1, 6, 5, 7, 4} fmt.Println("原數(shù)組:", nums) fmt.Println("--------------------------------") SelectionSort(nums) } func SelectionSort(nums [8]int) { for i := 0; i < len(nums)-1; i++ { minPos := i for j := i + 1; j < len(nums); j++ { if nums[minPos] > nums[j] { minPos = j } } nums[i], nums[minPos] = nums[minPos], nums[i] fmt.Printf("第 %d 輪后:%v\n", i+1, nums) } fmt.Println("--------------------------------") fmt.Println("排序后的數(shù)組:", nums) }
執(zhí)行結(jié)果:
原數(shù)組: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 輪后:[1 2 3 8 6 5 7 4]
第 2 輪后:[1 2 3 8 6 5 7 4]
第 3 輪后:[1 2 3 8 6 5 7 4]
第 4 輪后:[1 2 3 4 6 5 7 8]
第 5 輪后:[1 2 3 4 5 6 7 8]
第 6 輪后:[1 2 3 4 5 6 7 8]
第 7 輪后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的數(shù)組: [1 2 3 4 5 6 7 8]
- 升序排序。
- 使用
i
變量表示最小元素的待放位置。 minPos
變量記錄最小元素的的下標(biāo)值,默認(rèn)為i
。- 通過變量
j
去尋找最小元素,j
從i + 1
的位置開始尋找。 - 找到比
nums[minPos]
還小的元素,則將j
的下標(biāo)值賦給minPos
。 - 一輪下來,將最小元素的位置
minPos
與i
的位置互換,然后繼續(xù)下一輪尋找,直到所有元素都被排序。 - 該算法的時間復(fù)雜度為 O(N²)。
優(yōu)化算法
普通算法是尋找最小值或最大值,然后放到指定位置。優(yōu)化算法的改進點是同時尋找最小值和最大值。
import ( "fmt" ) func main() { nums := [4]int{3, 1, 4, 2} fmt.Println("原數(shù)組:", nums) fmt.Println("--------------------------------") SelectionSort(nums) } func SelectionSort(nums [4]int) { for left, right := 0, len(nums)-1; left <= right; { minPos := left maxPos := left for i := left + 1; i <= right; i++ { if nums[minPos] > nums[i] { minPos = i } if nums[maxPos] < nums[i] { maxPos = i } } nums[left], nums[minPos] = nums[minPos], nums[left] // 如果最大值剛好是在 left,待放最小值的位置,那么最大值就會被換走,所以需要判斷一下 if maxPos == left { maxPos = minPos } nums[right], nums[maxPos] = nums[maxPos], nums[right] fmt.Printf("第 %d 輪后:%v\n", left+1, nums) left++ right-- } fmt.Println("--------------------------------") fmt.Println("排序后的數(shù)組:", nums) }
執(zhí)行結(jié)果:
原數(shù)組: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 輪后:[1 2 3 4 6 5 7 8]
第 2 輪后:[1 2 3 4 6 5 7 8]
第 3 輪后:[1 2 3 4 5 6 7 8]
第 4 輪后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的數(shù)組: [1 2 3 4 5 6 7 8]
left
變量表示待放最小值的位置,right
變量表示待放最大值的位置。minPos
記錄最小值的下標(biāo)值,maxPos
記錄最大值的下標(biāo)值,通過變量i
去尋找最小值和最大值,尋找完畢后將它們進行交換。- 有一個注意的地方是,如果最大值剛好是在
left
,待放最小值的位置,那么最大值就會被換到minPos
的位置,所以需要判斷一下,糾正下標(biāo)值。 - 從執(zhí)行結(jié)果來看,優(yōu)化后的算法效率快了一倍,但是時間復(fù)雜度仍為 O(N²)。
小結(jié)
本文簡單介紹了什么是選擇排序,然后通過圖片的方式演示選擇排序的過程,接下來是實現(xiàn) O(N²) 時間復(fù)雜度的算法,最后優(yōu)化算法,從結(jié)果來看,優(yōu)化后的算法效率快了一倍,但是時間復(fù)雜度仍為 O(N²)。
以上就是基于Go語言實現(xiàn)選擇排序算法及優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于Go語言選擇排序算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang語言如何讀取http.Request中body的內(nèi)容
這篇文章主要介紹了Golang語言如何讀取http.Request中body的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全?
這篇文章主要介紹了Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05golang利用函數(shù)閉包實現(xiàn)簡單的中間件
中間件設(shè)計模式是一種常見的軟件設(shè)計模式,它在許多編程語言和框架中被廣泛應(yīng)用,這篇文章主要為大家介紹一下golang利用函數(shù)閉包實現(xiàn)一個簡單的中間件,感興趣的可以了解下2023-10-10Golang實現(xiàn)協(xié)程超時控制的方式總結(jié)
我們知道,go協(xié)程如果不做好處理,很容易造成內(nèi)存泄漏,所以對goroutine做超時控制,才能有效避免這種情況發(fā)生,本文為大家整理了兩個常見的Golang超時控制方法,需要的可以收藏一下2023-05-05