選擇排序是排序演算法的一種,這裡以從小到大排序為例進行講解。
選擇排序(從小到大)的基本思想是,首先,選出最小的數,放在第乙個位置;然後,選出第二小的數,放在第二個位置;以此類推,直到所有的數從小到大排序。
在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。
下面,以對 3 2 4 1 進行選擇排序說明排序過程,使用min_index 記錄當前最小的數所在的位置。
第1輪 排序過程 (尋找第1小的數所在的位置)
3 2 4 1(最初, min_index=1)
3 2 4 1(3 > 2, 所以min_index=2)
3 2 4 1(2 < 4, 所以 min_index=2)
3 2 4 1(2 > 1, 所以 min_index=4, 這時候確定了第1小的數在位置4)
1 2 4 3 (第1輪結果,將3和1交換,也就是位置1和位置4交換)
第2輪 排序過程 (尋找第2小的數所在的位置)
1 2 4 3(第1輪結果, min_index=2,只需要從位置2開始尋找)
1 2 4 3(4 > 2, 所以min_index=2)
1 2 4 3(3 > 2, 所以 min_index=2)
1 2 4 3(第2輪結果,因為min_index位置剛好在第2個位置,無需交換)
第3輪 排序過程 (尋找第3小的數所在的位置)
1 2 4 3(第2輪結果, min_index=3,只需要從位置2開始尋找)
1 2 4 3(4 > 3, 所以min_index=4)
1 2 3 4(第3輪結果,將3和4交換,也就是位置4和位置3交換)
至此,排序完畢。
選擇排序對大小為n的無序陣列r[n]進行排序,進行n-1輪選擇過程。第i輪選取第i小的數,並將其放在第i個位置上。當第n-1次完成時,第n小(也就是最大)的數自然在最後的位置上。
#include #includevoid select_sort(int a,int n)//
n為陣列a的元素個數
}//將第i小的數,放在第i個位置;如果剛好,就不用交換
if( i !=min_index)
}} intmain()
select_sort(a, n);
for(int i=0; i < n; i++)
printf("\n
");return0;
}
注意:選擇排序是一種不穩定的排序演算法,可能會打亂兩個相同數字的原有順序。
例如,序列 5 8 5 2 9, 按照從小到大排序,第一輪會將第1個數字5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了,所以選擇排序是一種不穩定的排序演算法。
排序 3 選擇排序
選擇排序 選擇排序理解起來非常簡單,直接摘錄 演算法導論 上的原話吧,因為理解起來真的是非常簡單。還是和之前一樣假設有陣列a 10 原話是這樣說的 首先找出陣列a中最小的那個元素,把該元素和a 0 中的元素進行交換。然後再找出陣列a中次小的元素,再把找出來的這個次小元素和a 1 中的元素交換。以此類...
排序3 選擇排序
選擇排序 原理 每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完.arr array rand range 1,100 10 shuffle arr arr 7,6,5,4,3,2,1 function select sort arr if ...
java 演算法3 選擇排序
筆記個人整理 選擇排序 原理 每次都找到當次最大的數,按大小順序依次放入陣列相應位置 比如 第一次先找到最大的數並記下其位置,如果其不在陣列第一位,則將其與第一位交換,使最大數置於第一位 第二次再迴圈查詢第二大的數並記下其位置,如果其不在陣列第二位,則將其與第二位交換,使最大數置於第二位 依次類推....