快速排序


快速排序的基本思想是,通過一輪的排序將序列分割成獨立的兩部分,其中一部分序列的關鍵字(這里主要用值來表示)均比另一部分關鍵字小。繼續對長度較短的序列進行同樣的分割,最后到達整體有序。在排序過程中,由於 已經分開的兩部分的元素不需要進行比較,故減少了比較次數,降低了排序時間。
通過兩個不相鄰元素交換,可以一次交換消除多個逆序,加快排序速度。快速排序方法在要排序的數據已經有序的情況下最不利於發揮其長處。
 
描述:定義left指針、right指針、base基准數。通過一遍便利讓left指針和right指針重合,此時數組就被分成了兩部分了。
 
案例:

下面我們通過一個案例來演示一下快速排序的基本步驟: 以序列 46 30 82 90 56 17 95 15   共8個元素

    初始狀態:     46  30  82  90  56  17  95  15        選擇46 作為基准值,i = 0, j = 7

           i = 0                                j = 7

                   15  30  82  90  56  17  95  46       15 < 46, 交換 15 和 46,移動 i, i = 1

             i = 1                           j = 7

            15  30  82  90  56  17  95  46       30 < 46, 不需要交換,移動 i , i = 2

               i = 2                   j = 7

            15  30  46  90  56  17  95  82       82 > 46, 交換82 和 46,移動 j , j = 6

               i = 2               j = 6

            15  30  46  90  56  17  95  82       95 > 46, 不需要交換,移動 j , j = 5

               i = 2         j = 5

            15  30  17  90  56  46  95  82       17 < 46, 交換46 和 17,移動 i, i = 3

                 i = 3    j = 5

            15  30  17  46  56  90  95  82       90 > 46, 交換90 和 46,移動 j , j = 4

               3 = i    j = 4

            15  30  17  46  56  90  95  82       56 > 46, 不需要交換,移動 j , j = 3(最關鍵的就是在這里停掉了)

                     i  =  j = 3

    

    i = j = 3, 這樣序列就這樣分割成了兩部分,左邊部分{15, 30, 17} 均小於 基准值(46);右邊部分 {56, 90,95,82},均大於基准值。這樣子我們就達到了分割序列的目標。在接着對子序列用同樣的辦法進行分割,直至子序列不超過一個元素,那么排序結束,整個序列處於有序狀態。

 

 

快速排序算法效率與穩定性分析

  當基數值不能很好地分割數組,即基准值將數組分成一個子數組中有一個記錄,而另一個子組組有 n -1 個記錄時,下一次的子數組只比原來數組小 1,這是快速排序的最差的情況。如果這種情況發生在每次划分過程中,那么快速排序就退化成了冒泡排序,其時間復雜度為O(n2)。

  如果基准值都能講數組分成相等的兩部分,則出現快速排序的最佳情況。

快速排序在進行交換時,只是根據比較基數值判斷是否交換,且不是相鄰元素來交換,在交換過程中可能改變相同元素的順序,因此是一種不穩定的排序算法。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM