白話計算機排序算法之選擇排序

1選擇排序的邏輯


我們剛剛看完了冒泡排序,今天再學習一下選擇排序,依然是用之前的題目, 這樣排列的6個數字。


白話計算機排序算法之選擇排序


通過選擇排序,把這6個數字按照從左到右從小到大的順序排列好,也就是目標是這樣的:


白話計算機排序算法之選擇排序


選擇排序的邏輯就是每次假定一個最小的數字,用它和其他數字比較,如果其他數字小,就把最小的數字設定為其他數字,最後把經過比較後最小的數字移到左邊。

下圖是進行了一輪全部元素比較之後,

白話計算機排序算法之選擇排序

這個數字被選擇出來的過程。


白話計算機排序算法之選擇排序


我們詳細分解一下這個過程:


首先把最小的數設置為左邊第一個數,也就是8(當前認定為最小的數字上方有一個紅色三角形), 用最小的數和它右邊所有的數字進行比較。

第一步,8和5比較,8比5大,所以把最小的數設置為5。

第二步,用最小的數5和它右邊數字3比較,5比3大,所以把最小的數設置為3。

第三,四,五步,都是用3和後面數字比較,因為後面數都比它大,所以經過這一輪比較後3是最小數字。

第六步,把3和第一位數字8進行交換,3被”選擇“了出來。


白話計算機排序算法之選擇排序


第一輪過後的結果是這樣的:


白話計算機排序算法之選擇排序


第二輪,先用左邊第二個數字5作為最小的數字與後面的所有數字進行比較,比較過程和第一輪類似,經過這一輪

白話計算機排序算法之選擇排序

被選擇了出來。


白話計算機排序算法之選擇排序


第三輪,先用第三個數字8作為最小的數字,經過這一輪

白話計算機排序算法之選擇排序

被選擇了出來。


白話計算機排序算法之選擇排序


第四輪,先用第四個數字6作為最小的數字,經過這一輪

白話計算機排序算法之選擇排序

被選擇了出來, 其實它本來就在這。


白話計算機排序算法之選擇排序


第五輪,先用第五個數字8作為最小的數字,經過這一輪

白話計算機排序算法之選擇排序

被選擇了出來。


白話計算機排序算法之選擇排序


第六輪,只剩最大的數字8在最右側,可以省略。

下面的選擇排序視頻同樣供大家參考。


2 編程實現


下面又到了上代碼時間了


白話計算機排序算法之選擇排序


交換元素這個子代碼已經在之前冒泡排序中講過,這次就不再講了,大家可以點藍字”冒泡排序“回看。

下面再拆解下主代碼是如何做出來的,我們可以按照之前的步驟進行拆解:

1. 如果只做一輪的選擇排序,代碼是這樣的,執行這段代碼

白話計算機排序算法之選擇排序

這個最小數字交換到最左邊。


白話計算機排序算法之選擇排序


2. 然後再給它套上一層循環,讓它按照列表數量循環,把所有數字都按照順序交換過去。


白話計算機排序算法之選擇排序


注意:


  • 在這個過程中內部循環每次j要從i+1開始,避免把之前已經歸位的數字重新”選擇“一遍。
  • 交換元素時是用最小項和當前的i進行交換
  • 內部循環是j>列表項目數,而外部循環是i=列表項目數,這樣在每次設定最小項的時候能夠把最後一項考慮進去,而最後一輪可以忽略掉對最後一項的處理。


如果這個列表基本有序,也就是每次選出來的最小項都恰好在i的位置上,為了減少交換的次數,可以加上這樣一個比較邏輯,可以減少與列表的數量成正比次操作;但是如果列表無序的情況,這種則會增加與列表的數量成正比次操作。所以大家視情況,一般可以不加。


白話計算機排序算法之選擇排序



3 對比冒泡排序


那麼到底冒泡排序好,還是選擇排序好呢?針對這個序列


白話計算機排序算法之選擇排序


每種排序都進行了5輪(第6輪省略),每一輪都進行了n-i次比較,n是列表的數量,i是第幾輪。兩種排序總的比較次數都是n(n-1)/2。

而交換次數上,每一輪,選擇排序最多交換1次,最少不需要交換;冒泡排序最多需要交換n-i次,所以如果是基本無序的數據,因為交換次數少,選擇排序要優於冒泡排序。

而在有序的數據上冒泡排序則要優秀得多,冒泡排序與n成正比,而選擇排序與n的平方成正比。


所以不能一概而論,大家需要視情況選擇不同的算法。


參考書籍:

《Scratch趣味編程進階》 清華大學出版社

《大話數據結構》清華大學出版社

《信息學奧賽一本通(C++版)》科學技術文獻出版社


分享到:


相關文章: