通過兩個不相鄰元素交換,可以一次交換消除多個逆序,加快排序速度。快速排序方法在要排序的數據已經有序的情況下最不利於發揮其長處。
下面我們通過一個案例來演示一下快速排序的基本步驟: 以序列 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)。
如果基准值都能講數組分成相等的兩部分,則出現快速排序的最佳情況。
快速排序在進行交換時,只是根據比較基數值判斷是否交換,且不是相鄰元素來交換,在交換過程中可能改變相同元素的順序,因此是一種不穩定的排序算法。