排序時間複雜度 快速排序 改進快排的方法

2021-10-22 10:45:07 字數 717 閱讀 3585

三種改進方案

改進方案:改進選取樞軸的方法

1、選取隨機數作為樞軸。

但是隨機數的生成本身是一種代價,根本減少不了演算法其餘部分的平均執行時間。

2、使用左端,右端和中心的中值做為樞軸元。

經驗得知,選取左端,右端,中心元素的中值會減少了快排大約 14%的比較。

3、每次選取資料集中的中位數做樞軸。

選取中位數的可以在 o(n)時間內完成。(證明見《演算法導論(第二版) 》) p111 第九章中位數

改進為隨機快排

隨機快排改進的地方只是在選取數的時候,將每次都選取最後位置的數改為選取隨機的乙個數作為num,這樣做的好處是什麼呢?

選取最後乙個數:如果是乙個已經排好序的陣列,每次找到位置之後,左邊是要進行排序的部分,陣列長度是原長度-1,它的時間複雜度就是o(n^2);如果每次找到的數都是中間的位置,它的時間複雜度就只有o(logn)

然而以隨機數作為選取的標準num的時候,因為是隨機的,就只能通過數學期望去計算它的時間複雜度,時間複雜度是o(logn)

快速排序時間複雜度分析

為了分析快速排序的時間複雜度,請先看下面的主定理 主定理 t n at n b f n 其中 a 1 and b 1 是常量 並且 f n 是乙個漸近正函式,為了使用這個主定理,您需要考慮下列三種情況 快速排序的每一次劃分把乙個 問題分解成兩個子問題,其中的關係可以用下式表示 t n 2t n 2 ...

堆排序時間複雜度 堆排序

科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...

氣泡排序 時間複雜度與空間複雜度

外迴圈是遍歷每個元素,每次都放置好乙個元素 內迴圈是比較相鄰的兩個元素,把大的元素交換到後面 等到第一步中迴圈好了以後也就說明全部元素排序好了 實現 include 列印陣列元素 void print array int array,int length printf n n void bubble...