快速排序與樹結構的絲絲縷縷

本文章只是自我總結,鞏固基礎之用,如有錯誤,望大佬不吝賜教。

1.1 快速排序簡介

快速排序的實現(xiàn)原理:

1.先選取一個基準值pivotkey;
2.在頭尾分別定義兩個指針:left,right;
3.兩個指針指向的值分別與基準值進行對比,當left指針的數(shù)組大于基準值,right指針的數(shù)值小于基準值時,兩個元素進行交換。

這樣就實現(xiàn)了,在基準值左邊的都是小于基準值的值,在基準值右邊的都大于基準值的值。如下動畫,以[6,3,8,2,4,7]數(shù)組為例,以6為基準值,介紹了一輪比較的過程:

快速排序

1.2 快速排序&樹結構

如果把快速排序與樹結構進行聯(lián)系,是更加方便對它的理解的。還是以上面的這個數(shù)組為例。

每一輪比較的過程,我們深入的來理解一下。對于找出基準值這個操作,就相當于在樹結構中樹立一個根節(jié)點。一輪比較就是把其他節(jié)點往根節(jié)點左右兩邊來擺放,只是這時左右兩顆子樹并沒有排序好,需要通過下一輪來進行排序。

如下圖,第一輪比較后,比節(jié)點6小的值到了其的左邊,比節(jié)點6大的值到了其的右邊。接下來第二輪比較后,數(shù)組[3,2,4]也已經(jīng)排序完畢。

image.png

1.3 時間復雜度

所以在這里,我們很容易的得出了該種算法的時間復雜度為(nlogn)級別,n為所有每一輪比較過程比較的次數(shù),logn為比較的輪數(shù),即為樹的深度。

但是樹的深度和選取的基準值有很大關系,基準值沒有選好,會導致樹退化成鏈表,增加了比較的輪數(shù),最差深度會變成n,所以此時時間復雜度為(n*n)級別。

image.png

用小小表格總結一下:

平均 最壞 最好 穩(wěn)定性
O(nlogn) O(n^2) O(nlogn) 不穩(wěn)定

快速排序java代碼如下:

public static void quickSort2(int[] a, int low, int high) {
        int pivot;

        if (low < high) {
            // 找出基準位置的同時,進行元素的交換
            pivot = partition(a, low, high);

            quickSort2(a, low, pivot - 1);
            quickSort2(a, pivot + 1, high);
        }
    }

    public static int partition(int[] a, int low, int high) {
        // 因為此處已經(jīng)記錄住了基準,所以low位置的數(shù)值可以被覆蓋掉。
        int pivotKey = a[low];

        while (low < high) {

            while (high > low && a[high] >= pivotKey) {
                high--;
            }

            //直接覆蓋low位置的值,low位置的值已經(jīng)被pivotKey記錄住
            a[low] = a[high];

            while (high > low && a[low] <= pivotKey) {
                low++;
            }

            //此時的a[high]的值被上面最初low位置的值記錄著
            a[high] = a[low];
        }

        //low就是基準值所在的位置
        a[low] = pivotKey;
        return low;
    }

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

相關閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結構就是研究數(shù)據(jù)的邏輯結構和物理結構以及它們之間相互關系,并對這種結構定義相應的運算,而且確保經(jīng)過這...
    Winterfell_Z閱讀 6,612評論 0 13
  • 知 識 點 / 超 人 數(shù)據(jù)結構算法排序是比較枯燥的知識,學習一定要耐著性子看,不然很容易理解錯誤。本文比較適合自...
    樹下敲代碼的超人閱讀 5,360評論 9 58
  • 最近在讀< >時,了解到了很多常用的排序算法,故寫一篇讀書筆記記錄下這些排序算法的思路和實現(xiàn). 冒泡排序 冒泡排序...
    SylvanasSun閱讀 829評論 0 0
  • 小嬸嬸患上初期宮頸癌的消息,在家里炸開了鍋,如同地獄的黑暗,籠罩了整個家族。 爸爸打電話過來,讓我過去看看她,陪她...
    向著太陽奔跑的石頭閱讀 463評論 0 0
  • 隆冬的時光,似乎永遠都是那么的冰冷與僵硬,但總有些力量能將之暖化、使之溫柔起來,比如一顆渴望過節(jié)的心,比如我們對待...
    發(fā)姨閱讀 420評論 0 5

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