1. 程式人生 > >演算法快學筆記(三):選擇排序的原理與實現

演算法快學筆記(三):選擇排序的原理與實現

1. 原理介紹

選擇排序是個簡單的排序,思路主要通過多次遍歷待排序的集合,每次彈出最大/小值並放入新的集合,直到原始集合為空。舉個例子:

假設要對A=[1,2,5,9,3]按照升序的方式進行排序,步驟與結果如下

  1. 從A中找出最大值,將其pop,並放入B中,執行後的結果如下:
A=[2,5,9,3]
B=[1]
  1. 重複執行第一部
A=[5,9,3]
B=[1,2]
  1. 重複執行第一部
A=[5,9]
B=[1,2,3]
  1. 重複執行第一部
A=[9]
B=[1,2,3,5]
  1. 重複執行第一部
A=[]
B=[1,2,3,5,9]
  1. 此時A為空,返回B

2. 執行時間分析

從上面的過程可以看出,要對A進行排序,必須要執行N輪操作,每一輪操作必須檢查列表中的每個元素。隨著排序的進行,每次需要檢查的元素數在逐漸減少,最後一次需要檢查的元素都只有一個。平均每次檢查的元素數為1/2 × n, 因此執行時間為O(n × 1/2 × n),但大O表示法省略諸如1/2這樣的常數,因此簡單地寫作O(n × n)或O(n^2)。

3. 程式碼實現

Go語言實現的過程如下:

// 對int陣列的選擇排序
func SelectSort(items []int) []int {
	result := make([]int,len(items))
	for i:=0;i< len(result);i++{
		tmpIndex := getMinItemIndex(&items)
		result[i]=items[tmpIndex]
		//從原始陣列中刪除掉被選擇的元素
		items = append(items[:tmpIndex], items[tmpIndex+1:]...)
	}
	return result
}

//獲取一個數組中,最小元素的位置
func getMinItemIndex(ints *[]int) int {
	//預設假設第一個元素作為臨時最小值
	min := (*ints)[0]
	smallestIndex :=0
	for index,item := range *ints {
		if item < min {
			min = item
			smallestIndex =index
		}
	}
	return smallestIndex
}

4. 總結

  • 選擇排序的時間複雜度為:O(n^2)