選擇排序是八大排序算法之一趾代,其排序原理是:
比如在一個長度為N的無序數(shù)組中稽坤,在第一趟遍歷N個數(shù)據(jù)糯俗,找出其中最小的數(shù)值與第一個元素交換其數(shù)據(jù)的索引位置,第二趟遍歷剩下的N-1個數(shù)據(jù)杖玲,找出其中最小的數(shù)值與第二個元素交換......第N-1趟遍歷剩下的2個數(shù)據(jù)淘正,找出其中最小的數(shù)值與第N-1個元素交換,至此選擇排序完成囤采。選擇排序與冒泡排序有點(diǎn)不同的是蕉毯,選擇排序是先交換下標(biāo),然后在交換數(shù)值进肯。用文字?jǐn)⑹鍪侵v不清楚的棉磨,還是通過流程來分析吧乘瓤。
如現(xiàn)在有一組數(shù)據(jù):[3, 1, 8, 6, 2, 5, 9, 4, 7]
使用選擇排序?qū)@組數(shù)據(jù)進(jìn)行排序,具體流程:
第一趟排序: 定義一個下標(biāo) int index = 0; 即先指向第一個數(shù)3抬吟,感嘆號代表下標(biāo)差油。
3 1 8 6 2 5 9 4 7
!
(1) 把index指向的數(shù)和下標(biāo)從1開始往后面依次遍歷的數(shù)字進(jìn)行比較蓄喇,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index刃鳄。即3>1,1的下標(biāo)是1钱骂,所以index=1; 這時(shí)候下標(biāo)index指向下標(biāo)就是1。
3 1 8 6 2 5 9 4 7
!
(2) 把index指向的數(shù)和下標(biāo)從2開始往后面依次遍歷的數(shù)字進(jìn)行比較愉烙,如果有數(shù)字比index指向的數(shù)小解取,則把那個數(shù)的下標(biāo)賦值給index。后面的數(shù)字都比1大蔓肯,這時(shí)候下標(biāo)index指向的下標(biāo)還是1蔗包。
3 1 8 6 2 5 9 4 7
!
.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候舟陆,發(fā)現(xiàn)還是沒有數(shù)字比index 1指向的數(shù)字1小吨娜,那就退出了循環(huán)淘钟,開始進(jìn)行數(shù)字的交換陪毡。
1 3 8 6 2 5 9 4 7 第一趟排序的結(jié)果
把第一個數(shù)和下標(biāo)為index的數(shù)進(jìn)行交換毡琉,這樣一來就相當(dāng)于把最小的數(shù)找到了并且放在第一位,接下來我們只需要對后面的8個數(shù)進(jìn)行排序即可慧耍。
第二趟排序:定義一個下標(biāo) int index = 1; 即先指向第二個數(shù)3丐谋,感嘆號代表下標(biāo)号俐。
1 3 8 6 2 5 9 4 7
!
(1)把index指向的數(shù)和從下標(biāo)為2開始的往后面依次遍歷的數(shù)字進(jìn)行比較,如果有數(shù)字比index指向的數(shù)小踪危,則把那個數(shù)的下標(biāo)賦值給index猪落。即3>2, 2的下標(biāo)是4笨忌,所以 index = 4; 這時(shí)候下標(biāo)index指向下標(biāo)就是4。
1 3 8 6 2 5 9 4 7
!
(2)把index指向的數(shù)和從下標(biāo)為3開始的往后面依次遍歷的數(shù)字進(jìn)行比較杂曲,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index咱揍。后面的數(shù)字都比2大棚饵,這時(shí)候下標(biāo)index指向的下標(biāo)還是4噪漾。
1 3 8 6 2 5 9 4 7
!
.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候题翰,發(fā)現(xiàn)還是沒有數(shù)字比index 4指向的數(shù)字2小诈胜,那就退出了循環(huán)焦匈,開始進(jìn)行數(shù)字的交換。
1 2 8 6 3 5 9 4 7 第二趟排序的結(jié)果
第三趟排序:定義一個下標(biāo) int index = 2; 即先指向第三個數(shù)8累魔,感嘆號代表下標(biāo)垦写。
1 2 8 6 3 5 9 4 7
!
(1)把index指向的數(shù)和從下標(biāo)為3開始的往后面依次遍歷的數(shù)字進(jìn)行比較版述,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index晚伙。即8>6, 6的下標(biāo)是3俭茧,所以 index = 3; 這時(shí)候下標(biāo)index指向下標(biāo)就是3母债。
1 2 8 6 3 5 9 4 7
!
(2)把index指向的數(shù)和從下標(biāo)為4開始的往后面依次遍歷的數(shù)字進(jìn)行比較尝抖,如果有數(shù)字比index指向的數(shù)小昧辽,則把那個數(shù)的下標(biāo)賦值給index登颓。即6>3, 3的下標(biāo)是4,所以 index = 4; 這時(shí)候下標(biāo)index指向下標(biāo)就是4框咙。
1 2 8 6 3 5 9 4 7
!
(3)把index指向的數(shù)和從下標(biāo)為5開始的往后面依次遍歷的數(shù)字進(jìn)行比較喇嘱,如果有數(shù)字比index指向的數(shù)小茉贡,則把那個數(shù)的下標(biāo)賦值給index。后面的數(shù)字都比3大者铜,這時(shí)候下標(biāo)index指向的下標(biāo)還是4腔丧。
.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候王暗,發(fā)現(xiàn)還是沒有數(shù)字比index 4指向的數(shù)字3小悔据,那就退出了循環(huán)庄敛,開始進(jìn)行數(shù)字的交換俗壹。
1 2 3 6 8 5 9 4 7 第三趟排序結(jié)果
根據(jù)這樣的流程一直循環(huán)下去,最終就會實(shí)現(xiàn)這樣的排序結(jié)果藻烤,后面的流程我就不繼續(xù)寫下去了绷雏。
直接上代碼:
public static void selectSort(int[] array){
for(int i = 0;i < array.length-1; i++){
int index = i;
for(int j = i+1;j < array.length; j++){
if(array[index] > array[j]){
index = j; //說明找到了比Index小的數(shù)的下標(biāo)
}
}
if(index != i){ //如果最小的數(shù)位置發(fā)生了變化就交換
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
}
選擇排序應(yīng)用場景:也是應(yīng)用在數(shù)據(jù)量小的情況下怖亭。