演算法 快速排序的分析 過程描述以及改進方法

2021-10-04 23:04:03 字數 1228 閱讀 6174

快速排序的基本思想是通過一趟排序將原表劃分成兩個子表,其一乙個子表的元素比另乙個子表的都要小,然後再對兩個子表進行快速排序,直到表中元素有序排列。

演算法分析與過程描述

從定義可以看出,快速排序的過程是遞迴的,因此,其排序過程可以描述成對應的一棵遞迴樹。以下分析假設待排序的表有n個元素。

當元素基本無序的時候,每一趟劃分都將原表劃分成兩個表,並且歸位乙個元素,這時劃分過程可以近似看成一棵完全二叉樹,所以樹高為o(l

og2n

)o(log_2n)

o(log2

​n);而每一趟劃分都會進行與待排序元素個數次減1次比較,歸根結底,每趟排序的時間複雜度與問題規模n有關,所以每一趟排序的時間複雜度為o(n

)o(n)

o(n)

。所以時間複雜度為o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

,這是平均時間複雜度,符合基於比較的排序演算法的最好時間複雜度。

當元素基本正序或者反序時,劃分過程就蛻化成一棵單支樹,樹高為o(n

)o(n)

o(n)

,而每一趟排序的時間複雜度與描述排序過程的樹形無關,所以依然是o(n

)o(n)

o(n)

,所以時間複雜度為o(n

2)

o(n^2)

o(n2

),這是最壞時間複雜度。

改進方法

基準選擇方法

選擇表中中間位置元素

三數中值

隨機數下標

針對正序或反序的情況,選擇選擇表中中間位置元素的方法。

void

quick_sort

(int

*arr,

int s,

int t)

}

基本的快速排序是將比較得到兩個元素進行交換,而元素的兩兩交換需要進行3次移動,其實可以利用輔助儲存空間的方法,將基準先用變數儲存,這個時候元素表在排序過程中就一直會有乙個空位置,實現兩個元素交換所需的移動次數就變成了2,這是一種空間換時間的方法。

int

partition

(int

*arr,

int low,

int high)

*(arr+i)

= pivot;

return i;

}

排序演算法分析 快速排序

假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,選擇中間位置的元素作為基準值 pivot value 其索引為 0 n 1 2 從第0個元素開始從左往右找到比基準值大的元素,其索引為i從第n 1個元素開始從右往左找到比基準值小的元素,其索引為j交換這兩個元素 從索引i...

快速排序演算法分析

快速排序演算法 include include void quicksort int arr,int nleft,int nright i nleft j nright int nmid nleft nright 2 int nmidval arr nmid while i j from right...

快速排序演算法分析

經常在面試時會有面試官要求直接寫出快速排序演算法,因為該演算法在排序演算法中占有非常重要的地位,它排序效率高,達到o nlogn 最壞的情況也是o n 2 它的思想為對於乙個待排序的序列,首先隨機選取乙個元素作為樞軸,然後通過元素值的比較,將整個序列分成兩部分,前一部分所有元素都小於或等於該樞軸元素...