演算法與資料結構(7) 快速排序(二路 三路)

2021-08-20 11:02:55 字數 1888 閱讀 5041

介紹了快排分界的標誌點,選取的隨機性會大大降低快排退化成o(n^2)演算法的概率。

問題:當包含大量相同的元素的陣列時

快排仍會退化成o(n^2)級別的演算法

我們之前判斷的時候,並沒有判斷等於的情況~   這樣會造成乙個結果,把相同的放入左右任何一部分,會造成極其的不平衡,仍會退化成o(n^2)演算法~

演算法思路:

當掃瞄的元素e大於v:

從下標 j這個位置向前掃瞄, 

}注意: 在判定條件中,邊界情況只能是 < 或 >,而不是 <= 或 >=

對於arr[i]<=v和arr[j]>=v的方式,第一次partition得到的分點是陣列的倒數第二個。

因為我們的目的就是要讓重複的均勻在兩邊的陣列中,而第二種方式還是會將連續出現相等的值歸為一方,這樣還是會導致兩顆子樹的不平衡,還是會出現導致o(n^2)的情況出現。

二路排序只是提公升了一下效率,當有大量重複值排序的時候,還是會淪為o(n^2)的排序演算法,之前的二路,將陣列分成兩部分,小於v,大於v,兩部分是都含有等於v的,只是說盡可能的均勻分布,當存在大量的重複可能效率還是不好,而三路快排則是多加了一部分等於v~

e 小於v :在學習之前二路快速排序法,應該有思路了,將下標i的元素值和下標 lt+1(即等於v綠色部分的第乙個元素)交換,然後i下標後移,繼而判斷下乙個元素;lt下標後移,代表小於v的元素新增了乙個。

e 大於v :同理,將下標i的元素值和下標 gt-1(紫色部分的前乙個元素)交換,gt下標前移,代表大於v的元素新增了乙個。

注意此時下標i 無需後移,因為不同於小於v 部分,此時交換後的元素是未處理過的,所以直接判斷即可!

}歸併排序,二路,三路快速排序比較

測試二:面臨近乎有序陣列時,歸併排序最佳。

測試三:

面臨包含大量重複元素陣列的情況下,三路快速排序比歸併排序、快速排序有質變的超越!

一般系統級別的快速排序都會選擇三路快速排序,因為它在處理包含大量重複元素時,效能極高,即使不是,它的效能也得到保證,不會太差。

資料結構 快速排序,二路快排,三路快排

快速排序採用分治的思想對資料進行排序 選擇乙個基準值 將比基準值小的放在基準值的左邊,其餘的 大於或者等於 放在右邊 然後再對左邊和右邊繼續進行劃分,直到劃分的區間長度為1 快速排序劃分區間的時候為o logn 每次都需要時間複雜度為o n 進行排序 所以快排的時間複雜度是o nlogn 這是將對於...

(C )資料結構排序 二路歸併排序

二路歸併排基本思想 把擁有n個資料的陣列看做n個有序序列,然後兩兩歸併,得到n 2組有序序列 重複上述操作,達到n 4組有序序列 重複上述操作,直到n個資料均為有序。平均情況的時間複雜度 最好情況的時間複雜度 最壞情況的時間複雜度 空間複雜度 o nlog2 n o nlog2 n o nlog2 ...

常用的資料結構之二路歸併排序

其排序演算法的基本思想就是,將原序列 假設有n個關鍵字 分成很多個子序列每個子串行就有乙個關鍵字且子串行之間是個不相同的。之後就是將兩兩的子串行進行合併,所以整個資料規模就變成了n 2,之後在進行重複操作,資料規模不斷的除以2,直至變為1。以下是 void merge int a,int low,i...