1. 程式人生 > >Java實現經典排序演算法及複雜度穩定性分析

Java實現經典排序演算法及複雜度穩定性分析

        /* 氣泡排序 */  
        public static int[] bubbleSort(int[] arry) {  
            for (int i = 0; i < arry.length; i++) {  
                for (int j = i; j < arry.length - i - 1; j++) {  
                    if (arry[j] > arry[j + 1]) {  
                        int temp = arry[j];  
                        arry[j] = arry[j + 1];// 交換順序,大的在後,小的在前  
                        arry[j + 1] = temp;  
                    }  
                }  
            }  
            return arry;  
        }  
/* 插入排序 */  
/* 
 * 基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從後向前找到合適位置後) 
 * 直到全部插入排序完為止。(類似於撲克牌抓牌) 
 */  
public static int[] insertSort(int[] arry) {  
    // 從陣列第二位開始,第一位為初始排好的順序  
    for (int i = 1; i < arry.length; i++) {  
        int temp = arry[i];// 儲存待插入的數值  
        int j = i - 1;// 當前數值的前一位陣列角標  
        for (j = i - 1; j >= 0; j--) {  
            if (arry[j] > temp) {  
                arry[j + 1] = arry[j];// 將前一位數值移動一位(內部迴圈比較找到要最後要插入的位置)  
            } else {  
                break;  
            }  
        }  
        arry[j + 1] = temp;// 將待插入的數值插入合適的位置  
    }  
    return arry;  
}

    /* 簡單選擇排序 */  
    /* 
     * 基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換; 
     * 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。 
     */  
    public static int[] choiceSort(int[] arry) {  
        for (int i = 0; i < arry.length; i++) {  
            int low = i;  
            for (int j = i + 1; j < arry.length; j++) {  
                if (arry[j] < arry[low]) {  
                    low = j;// 尋找最小數值位置  
                }  
            }  
            // 將當前第一個元素與它後面序列中的最小的一個 元素交換,也就是將最小的元素放在最前端  
            int temp = arry[i];  
            arry[i] = arry[low];  
            arry[low] = temp;  
        }  
        return arry;  
  
    }

    /* 快速排序 */  
    /* 
     * 基本思想:選擇一個基準元素,通常選擇第一個元素或者最後一個元素, 通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素, 
     * 此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。 
     *  
     * 一趟快速排序的演算法是: 
        1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 
        2)以第一個陣列元素作為關鍵資料,賦值給key,即key=A[0]; 
        3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換; 
        4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於key的A[i],將A[i]和A[j]互換; 
        5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i] 
                          不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行 
                          交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。 
     */  
    public static int[] quickSort(int[] arry, int low, int high) {  
        if (low < high) {  
            int middle = getMiddle(arry, low, high);  
            quickSort(arry, 0, middle - 1);//遞迴快排左邊這個部分  
            quickSort(arry, middle + 1, high);//遞迴快排右邊這個部分  
        }  
        return arry;  
  
    }

private static int getMiddle(int[] arry, int low, int high) {  
    int temp = arry[low];// 基準元素  
    while (low < high) {  
        while (low < high && arry[high] >= temp) {  
            high--;//從最右邊往左找小於基準的元素  
        }  
        arry[low] = arry[high];//交換位置,小的在基準元素左邊  
        while (low < high && arry[low] <= temp) {  
            low++;//從基準元素的右邊找大於它的元素  
        }  
        arry[high] = arry[low];//交換位置,大的在基準元素右邊  
    }  
    //當low == high,完成一趟快速排序  
     arry[low] = temp;  
    return low;  
}

平均時間複雜度比較:

冒泡:O(n^2)
插入:O(n^2)
選擇:O(n^2)
快排:O(nlgn)

穩定性:

冒泡:穩定
插入:穩定
選擇:不穩定

快排:不穩定

轉載自:http://blog.csdn.net/u013812939/article/details/46739923點選開啟連結