快速排序

快速排序(時間復(fù)雜度:O(N*logN))

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序。
它采用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。
最壞運行情況是 O(n2)

動圖演示:


快速排序gif

該方法的基本思想是:

1.先從數(shù)列中取出一個數(shù)作為基準數(shù)。
2.分區(qū)過程,將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。
3.再對左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個數(shù)。

代碼演示(java)

/**
 * 快速排序
 * 分成兩組,和中間值進行比較,小的放左邊,大的放右邊;
 *
 *
 * @param arr 需要排序的數(shù)組
 * @param l   左邊的下標,從最左邊開始
 * @param r   右邊的下標,從最右邊開始
 */
public static void sort(int[] arr, int l, int r) {
    // 左邊下標
    int left = l;
    // 右邊下標
    int right = r;
    // 中間值, TODO 注意:不能用數(shù)組的長度,否則得到的不是中間值
    int middle = arr[(l + r) / 2];
    // 臨時變量,用于輔助交換
    int temp;

    // 和中間值進行小的放左邊,大的放右邊
    while (left < right) {

        // 從左邊開始遍歷,小于中間值則放左邊
        while (arr[left] < middle) {
            left += 1;
        }
        // 從右邊開始遍歷,大于中間值則放右邊
        while (arr[right] > middle) {
            right -= 1;
        }
        // 左邊下標 >= 右邊下標則比較結(jié)束
        if (left >= right) {
            break;
        }
        // 交換,整個方法只有這里進行了排序.
        temp = arr[right];
        arr[right] = arr[left];
        arr[left] = temp;

        // 如果左邊和中間值相等,則右邊下標左移
        if (arr[left] == middle) {
            right -= 1;
        }
        // 如果右邊和中間值相等,則左邊下標右移
        if (arr[right] == middle) {
            left += 1;
        }
    }
    // 如果相等則繼續(xù)移動,避免棧溢出
    if (right == left) {
        left += 1;
        right -= 1;
    }

    // 向左邊遞歸
    if (l < right) {
        sort(arr, l, right);
    }
    // 向右邊遞歸
    if (r > left) {
        sort(arr, left, r);
    }

}

查看源碼

選擇排序

冒泡排序

插入排序

參考地址:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/6.quickSort.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容