選擇排序-算法及優化


前言

前面我們介紹了一種經典的排序算法——冒泡排序。通過依次比較、交換相鄰元素,使最大值浮到數組末端。今天我們介紹另一種經典的排序算法:選擇排序。

用數組的第一個元素與后面的元素進行比較,如果有更小值則互換。再用交換后得到的更小的值繼續與之后的元素進行比較,直到該位置的元素是整個數組的最小值。以此類推,使下一個位置的元素是數組剩余元素中的最小值,直到所有元素排列完畢。這就是選擇排序大致的實現過程。

代碼

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 ;
        }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM