前言
前面我們介紹了一種經典的排序演算法——氣泡排序。通過依次比較、交換相鄰元素,使最大值浮到陣列末端。今天我們介紹另一種經典的排序演算法:選擇排序。
用陣列的第一個元素與後面的元素進行比較,如果有更小值則互換。再用交換後得到的更小的值繼續與之後的元素進行比較,直到該位置的元素是整個陣列的最小值。以此類推,使下一個位置的元素是陣列剩餘元素中的最小值,直到所有元素排列完畢。這就是選擇排序大致的實現過程。
程式碼
public static void main(String[] args) {
int [] arry = {3,7,2,9,5,6,4,2,1,5};
for (int i = 0; i < arry.length-1; i++) {
//i控制基準位置,i = 0即從陣列首位開始依次確定元素
for(int j = i+1 ;j < arry.length ;j++){
if(arry[j]>arry[i]){ //小於基準位置的值則交換
int temp = arry[i];
arry[i] = arry[j];
arry[j] = temp ;
}
}
}
}
當然,也可以從陣列末位開始確定元素。
public static void main(String[] args) {
int [] arry1 = {5,8,4,5,7,7,5,6,2,9};
for (int i = arry1.length-1; i > 0; i--) {
//i控制基準位置,i = 陣列長度-1即從陣列末尾開始依次確實元素
for(int j = i-1;j>=0;j--){
if(arry1[j]>arry1[i]){ //大於基準位置的值則交換
int temp = arry1[i];
arry1[i] = arry1[j];
arry1[j] = temp;
}
}
}
}
優化
上述的選擇排序仍然沒有避免像氣泡排序一樣,進行了頻繁的交換。實際上,完全不需要進行過多的交換。確定基準位置後,只需直接找到陣列剩餘元素的最小值,然後再和基準位置進行交換即可 ,如此一來,針對每個位置只需要進行一次交換。
優化後的程式碼如下:
public static void main(String[] args) {
int [] arry2 ={5,7,8,6,8,9,1,5,7,6,3,4} ;
for (int i = 0; i < arry2.length-1; i++) {
int minIndex = i; //假設基準位置是最小值
for (int j = i+1;j < arry2.length;j++){
if(arry2[j]<arry2[minIndex]){ //找出剩餘元素中的最小值的索引
minIndex = j;
}
}
int temp = arry2[i]; //交換最小值和基準位置的值
arry2[i] = arry2[minIndex];
arry2[minIndex] = temp ;
}
}