說明
選擇排序,無需申請新的內(nèi)存地址京闰。算法邏輯簡單颜及,易于實現(xiàn)。缺點是算法運行時間為
邏輯
從數(shù)組第一個元素開始蹂楣,對比后繼所有元素俏站,得出當前最小值,并與第一個元素交換位置痊土。依次類推肄扎,最后得到排完序的數(shù)組。
代碼
package arithmetic
import (
"math"
)
//InterfaceSort 排序接口 選擇排序 插入排序
type InterfaceSort interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
//SortSelection 選擇排序
func SortSelection(slice InterfaceSort) {
if slice.Len() < 2 {
return
}
for i := 0; i < slice.Len(); i++ {
var smallestIdx = i
var j = i
for ; j < slice.Len(); j++ {
if slice.Less(j, smallestIdx) { // slice[j] < smallest
smallestIdx = j
}
}
slice.Swap(i, smallestIdx)
}
}
代碼說明
面向?qū)ο髮崿F(xiàn)赁酝,結(jié)構(gòu)體實現(xiàn)相關(guān)接口即可調(diào)用該函數(shù)犯祠。
排序后的結(jié)果直接通過參數(shù)返回。
測試代碼
package main
import (
"AZframework/arithmetic"
"fmt"
)
//IntSlice []int
type IntSlice []int
func (s IntSlice) Len() int { return len(s) }
func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] }
func main() {
var sliceC = IntSlice{5, 5, 4, 3, 2, 1, 1}
arithmetic.SortSelection(sliceC)
fmt.Printf("SortSelection slice = %v \n", sliceC)
}
日志輸出
SortSelection slice = [1 1 2 3 4 5 5]