1. 程式人生 > >氣泡排序和快速排序(java實現)

氣泡排序和快速排序(java實現)

氣泡排序 Bubble Sort

在基於 “交換” 進行排序的方法中,氣泡排序是比較簡單的一種。

/**
 * 氣泡排序
 * 時間複雜度為O(n^2),空間複雜度為O(1)
 */
public static int[] bubbleSort(int[] array){
    boolean change = true;
    for (int i = array.length-1; i >= 1 && change; --i) {
        change = false;
        for (int j = 0; j < i; ++j) {
            if
(array[j] > array[j+1]) { int t = array[j]; array[j] = array[j+1]; array[j+1] = t; change = true; } } } return array; }

大部分見到的氣泡排序是沒有 change 變數的。change 變數的作用是,在序列初始有序或基本有序時可以減少比較的次數,還是有存在的必要的。

快速排序 Quick Sort

快速排序是對氣泡排序的一種改進。快速排序的平均時間複雜度為O(nlog n),最壞情況下為O(n2)。所謂最壞情況,即原始順序為逆序。

/**
 * 快速排序,是對氣泡排序的改進。
 * 平均時間複雜度為O(nlog n),最壞情況下為O(n^2)
 */
public static int partition(int []array,int low,int hight){
    int pivot = array[low];
    while(low < hight) {
        while (low < hight && array[hight] >= pivot) hight--;
        array
[low] = array[hight]; while (low < hight && array[low] <= pivot) low++; array[hight] = array[low]; } array[low] = pivot; return low; } public static void QSort(int []array,int low,int hight) { if (low < hight) { int pivotIndex = partition(array, low, hight); QSort(array, low, pivotIndex-1); QSort(array, pivotIndex+1, hight); } } public static void quickSort(int []array) { QSort(array,0,array.length-1); }

快速排序的核心思想是,經過一趟排序後將待排序列分為兩個部分,其中一部分的值都要大於另一部分。然後分別將每部分再次排序,一直到整個序列有序。

partition 方法代表的是一趟排序。首先要確定一個支點 pivot ,一般可以取序列的第一個值。然後從序列的兩端取值與支點比較,將大於支點的值放一端,小於的放另一端。

迴圈直至 low = hight ,此時序列被分為兩部分,pivot 就處於當前 low/hight 的位置。返回支點的下標。

QSort 方法是遞迴呼叫 partition 方法,目的是分別對每個序列再次排序。

更多面試常見演算法問題 歡迎 Star !