public
void
selectionsort
(int
a)}if
(minindex != i)
}}
其中 swap 方法用於交換陣列元素:
private
void
swap
(int
a,int i,
int j)
一共進行 n-1 輪,每輪都確定乙個最小的數(也可以是最大的),記錄下最小數的索引,最後再和開頭的數交換。
選擇排序比起氣泡排序,優化的地方在於減少了交換次數。氣泡排序在一輪中元素可能要交換多次,而選擇排序只是比較元素,先記錄下最小(大)值,等到一輪遍歷完成後才進行交換(如果需要的話)。
當前,交換的次數是減少了,但有時也會增加比較的次數。因為選擇排序需要進行的輪次是固定的,不能像氣泡排序那樣提取結束。
其中乙個優化思路是:每一輪遍歷分別選出最大值和最小值的索引,可以減少遍歷輪次。
public
void
selectionsort_b
(int
a)if(a[i]
> a[maxindex])}
if(minindex == maxindex)
// 剩下的數中,保證 a[left] 最小,a[right] 最大
if(left != minindex)
// 注意:left == maxindex 的情況需要進行特殊處理
// 因為經過上面的 if 後,原來的 a[left] 已經交換到了 a[minindex] 處,
// 所有如果 left 是 maxindex 的話,就需要更新一下 maxindex
if(maxindex == left)
if(right != maxindex)
// 更新邊界
left++
; right--;}
}
在遍歷完後進行交換時,需要注意索引的更新:
if
(left != minindex)
// 注意:left == maxindex 的情況需要進行特殊處理
// 因為經過上面的 if 後,原來的 a[left] 已經交換到了 a[minindex] 處,
// 所有如果 left 是 maxindex 的話,就需要更新一下 maxindex
if(maxindex == left)
if(right != maxindex)
留意中間那個 if,如果 maxindex == left,那麼在 left 處的最大值可能已經被換到 minindex 處了(在第乙個 if 處被換掉),所以要記得更新 maxindex。
例如對於陣列[10,5,0,6,4]
,假設此時 left = 0、right = 4,迴圈一次後,得到 minindex = 2, maxindex = 0。
首先將 left 和 minindex 位置的元素交換,得到陣列[0,5,10,6,4]
。
明顯現在的最大值的索引已經變成 2 了,但 maxindex 還是 0,如果不更新 maxindex 的話,最終的結果就是[4,5,10,6,0]
,顯然這是錯誤的。
選擇排序及其優化
一 原始的選擇排序 選擇排序 selection sort 是一種簡單直觀的 排序演算法 它的工作原理是每一次從待排序的 資料元素 中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。includeusing namespace std void selections...
選擇排序及其優化
選擇排序基礎版 public static int selectsort int array int temp array i array i array index array index temp return array 選擇排序就是在未序的序列中選出乙個最大或最小的值放到已序序列的末尾,當內...
選擇排序法及其優化
選擇排序法及其優化 巧若拙選擇排序基礎演算法是每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。選擇排序基礎演算法 如下 void selectsort 1 int vec,int n 選擇排序基礎演算法 int i,j,min in...