排序系列 快速排序 實現 複雜度分析

2021-06-16 10:17:14 字數 1165 閱讀 1570

交換排序類:氣泡排序,快速排序

他們的共同點就在於,通過記錄的交換,最終得到想要的結果。

下面實現快速排序。

思想:通過一趟排序將待排記錄劃分為兩部分。(作為劃分標記的記錄,已經保證是在它正確的位置)再對那兩部分,再進行劃分。知道劃分為乙個乙個單獨的資料,此時,所有記錄已經是排好序了。

複雜度分析:

快速排序的時間效能取決於快速排序遞迴的深度。我們假設在最優情況下,partition總是在每次劃分的中間位置。用遞迴樹描述,此遞迴樹是平衡的。深度為(logn(下取整)+1),即取遞迴次數為logn次。那麼也就是說,總共執行了logn次找到了樞軸。而每次的找樞軸過程都是對n個數中查詢的,即使是一分為二,2*(n/2)=n,則最優時間複雜度為o(nlogn)。最壞情況下,就是待排序列為正序或者倒序狀態。此時,遞迴樹就是一顆斜樹。執行n-1次遞迴呼叫,第i次劃分需要n-i次關鍵字比較。總比較次數為n(n-1)/2;複雜度為o(n^2)

輔助空間:o(logn)~~o(n),最優情況和最壞情況。最優情況可劃分遞迴圖,方便理解,同層次的1個空間共享。

#include

using namespace std;

#define maxsize 20

int search(int a, int low, int high)

a[low] = a[high];

while(low < high && a[low] < tmp )

a[high] = a[low];

}a[low]=tmp;   // 在樞軸的位置上,方式tmp應該在的位置。也就是它的最終位置。

return low;

}int* quicksort(int a,int low, int high)

return

a;  //返回位址。注意函式定義返回值型別為指標。}

int main();

int n;

int i;

int *pointer;

cout

cout< arr[i];

}pointer = quicksort(arr, 1, n);

for(i=1; i<=n; i++)

{cout<

歸併排序,快速排序,堆排序實現及複雜度分析

排序中比較複雜的有歸併排序,快速排序,堆排序三大演算法了,三個演算法的時間複雜度都是o n logn 三個演算法的思想我就簡單的展開詳述以下。歸併排序的核心思想是鍊錶中的經典題目 合併兩個有序鍊錶。劍指offer 合併兩個排序的鍊錶 leetcode p21 merge two sorted lis...

快速排序時間複雜度分析

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

快速排序最好,最壞,平均複雜度分析

我們來分析一下快速排序法的效能。快速排序的時間效能取決於快速排序遞迴的深度,可以用遞迴樹來描述遞迴演算法的執 況。如圖9 9 7所示,它是在快速排序過程中的遞迴過程。由於我們的第乙個關鍵字是50,正好是待排序的序列的中間值,因此遞迴樹是平衡的,此時效能也比較好。圖9 9 7 在最優情況下,parti...