Java排序算法之直接選擇排序


Java排序算法之直接選擇排序

基本過程:假設一序列為R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比較,若小於R[0],則交換至R[0]位置上。第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列。

Java代碼實現:

 

public class Xuanze {
    public static void main(String[] args) {
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            for(int j=i+1;j<s.length;j++){
                if(s[i]>s[j]){
                    temp=s[i];
                    s[i]=s[j];
                    s[j]=temp;
                }
            }
        }
        for(int value:s)
        System.out.print(value);    
    }
}

 

上面排序方法存在效率問題。因為當我們發現當前數比被比較數小的時候我們就交換兩個數,其實我們可以把當前數的位置保存下來,等到第一次比較完后在進行交換。

public class Xuanze {
    
    public static void main(String[] args) {
        
        int [] s = {8,3,2,1,7,4,6,5};
        int temp = 0;
        for(int i=0;i<s.length-1;i++){
            temp = i;
            for(int j=i+1;j<s.length;j++){
                if(s[temp]>s[j]){
                    temp=j;  //保存位置
                }
            }
            if(temp!=i) exchang(s,i,temp);  //進行交換
        }
        for(int value:s)
        System.out.print(value);        
    }

    private static void exchang(int[] s, int i, int j) {
        int temp = s[j];
        s[j]=s[i];
        s[i]=temp;    
    }
}

算法性能分析:

時間復雜度:假設有n個數據,數據交換的次數最多為n-1次,但程序的總體的比較次數較多。所以綜合考慮有直接選擇排序的時間復雜度為O(n2)

       (n的平方)。所以當記錄占用字節數較多時,通常比直接插入排序的執行速度快些。

空間復雜度:直接選擇排序的空間復雜度很好,它只需要一個附加單元用於數據交換,所以其空間復雜度為O(1)。

穩定性:在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素后面,那么 交換后穩定性就被破壞了。舉個例子,序列5 8 5 2 9, 我們知道第一遍選擇第1個元素5會和2交換,那么原序列中2個5的相對前后順序就被破壞了,所以選擇排序不是一個穩定的排序算法。

 


免責聲明!

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



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