圖解排序算法之快速排序-雙端探測法

 這是我見過的解釋快速排序最好的文章,分享以下:算法

        假如咱們的計算機每秒鐘能夠運行10億次,那麼對1億個數進行排序,桶排序則只須要0.1秒,而冒泡排序則須要1千萬秒,達到115天之久,是否是很嚇人。那有沒有既不浪費空間又能夠快一點的排序算法呢?那就是「快速排序」啦!光聽這個名字是否是就以爲很高端呢。學習

 

        假設咱們如今對「6  1  2 7  9  3  4  5 10  8」這個10個數進行排序。首先在這個序列中隨便找一個數做爲基準數(不要被這個名詞嚇到了,就是一個用來參照的數,待會你就知道它用來作啥的了)。爲了方便,就讓第一個數6做爲基準數吧。接下來,須要將這個序列中全部比基準數大的數放在6的右邊,比基準數小的數放在6的左邊,相似下面這種排列。排序

       3  1  2 5  4  6  9 7  10  8變量

 

        在初始狀態下,數字6在序列的第1位。咱們的目標是將6挪到序列中間的某個位置,假設這個位置是k。如今就須要尋找這個k,而且以第k位爲分界點,左邊的數都小於等於6,右邊的數都大於等於6。想想,你有辦法能夠作到這點嗎?方法

 

        給你一個提示吧。請回憶一下冒泡排序,是如何經過「交換」,一步步讓每一個數歸位的。此時你也能夠經過「交換」的方法來達到目的。具體是如何一步步交換呢?怎樣交換才既方便又節省時間呢?先別急着往下看,拿出筆來,在紙上畫畫看。我高中時第一次學習冒泡排序算法的時候,就以爲冒泡排序很浪費時間,每次都只能對相鄰的兩個數進行比較,這顯然太不合理了。因而我就想了一個辦法,後來才知道原來這就是「快速排序」,請容許我小小的自戀一下(^o^)。im

        方法其實很簡單:分別從初始序列「6  1  2 7  9  3  4  5 10  8」兩端開始「探測」。先從右往左找一個小於6的數,再從左往右找一個大於6的數,而後交換他們。這裏能夠用兩個變量i和j,分別指向序列最左邊和最右邊。咱們爲這兩個變量起個好聽的名字「哨兵i」和「哨兵j」。剛開始的時候讓哨兵i指向序列的最左邊(即i=1),指向數字6。讓哨兵j指向序列的最右邊(即j=10),指向數字8。img

 

       首先哨兵j開始出動。由於此處設置的基準數是最左邊的數,因此須要讓哨兵j先出動,這一點很是重要(請本身想想爲何)。哨兵j一步一步地向左挪動(即j--),直到找到一個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數大於6的數停下來。最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。計算機

 

 

 

 

       如今交換哨兵i和哨兵j所指向的元素的值。交換以後的序列以下。分享

        6  1  2  5  9 3  4  7  10  8時間

 

 

 

        到此,第一次交換結束。接下來開始哨兵j繼續向左挪動(再友情提醒,每次必須是哨兵j先出發)。他發現了4(比基準數6要小,知足要求)以後停了下來。哨兵i也繼續向右挪動的,他發現了9(比基準數6要大,知足要求)以後停了下來。此時再次進行交換,交換以後的序列以下。

相關文章
相關標籤/搜索