快速排序算法學習總結

快速排序算法


入菊廠兩年了,光陰似箭讓人唏噓不已。業務代碼確實寫了不少,好像什麼都知道一點卻又不精通,學校學的都忘光了,博客也太久沒動過了,實在慚愧。最近打算一點點撿起來,諸君共勉。直接上java代碼。
參考了兩位同學的博客,傳送門:
https://blog.csdn.net/tomcmd/article/details/48009195
https://blog.csdn.net/mingming_shiwo/article/details/75566706

“`
package com.huawei.sort;

public class TestQuickSort {

/*
  快速排序

  算法思路:
  1.首先採用分治的思想,選取基準值把序列分成兩個子序列,基準值左側的子序列都比基準值小,
  而基準值右側的子序列都比基準值大。
  2.然後用遞歸的思想,每個子序列只有一個元素時,整個序列變得有序。

  算法步驟:
  1.對於一個數組A(A[0]到A[n-1]),選取基準值key=A[0];
  2.設置兩個變量low,high,分別指向數組的首端、尾端;
  3.從尾端開始,一直high--,直到遇到比key小的元素,交換A[high]和A[low];
  4.從首端開始,一直low++,  直到遇到比key大的元素,交換A[low]和A[high];
  5.當low和high相等時,完成一趟快速排序,新的基準值key=A[low]
  6.對於新基準值左右兩側的兩個序列,一直遞歸的進行快速排序,直到每個序列都只有1個元素,整個序列便有序了。
*/


public static void main(String[] args) {
    int[] arr = { 5, 4, 3, 2, 1 };

    System.out.println("before sorted arr = ");
    printArr(arr);

    quickSort(arr, 0, arr.length - 1);

    System.out.println("after sorted arr = ");
    printArr(arr);
}

public static void quickSort(int[] arr, int low, int high) {

    if (low < high) {
        // 返回值keyPos是每次排序的基準值下標
        int keyPos = findKeyPosition(arr, low, high);
        // 對左邊子序列排序
        quickSort(arr, 0, keyPos - 1);
        // 對右邊的子序列排序
        quickSort(arr, keyPos + 1, high);
    }
}

/**
 * 進行一趟快速排序,在排序結束後,返回新的基準值在數組中的下標
 * 
 * @param arr
 *            待排序序列
 * @param low
 *            指向待排序序列的首端
 * @param high
 *            指向待排序序列的尾端
 * @return 新的基準值在數組中的下標
 */
public static int findKeyPosition(int[] arr, int low, int high) {
    // 基準值key
    int key = arr[low];

    while (low < high) {
        while (low < high && arr[high] >= key) {
            high--;
        }
        // arr[low] = arr[high];
        swap(arr, low, high);

        while (low < high && arr[low] <= key) {
            low++;
        }
        // arr[high] = arr[low];
        swap(arr, low, high);
    }

    System.out.println("low = " + low + ",high = " + high);
    // 此時low high相等,arr[low] = key亦可;
    arr[high] = key;
    return low;
}

public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

public static void printArr(int[] arr) {
    for (int i : arr) {
        System.out.print(i + " ");
    }
    System.out.println();
}

}

“`這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章