交換排序類:氣泡排序,快速排序
他們的共同點就在於,通過記錄的交換,最終得到想要的結果。
下面實現快速排序。
思想:通過一趟排序將待排記錄劃分為兩部分。(作為劃分標記的記錄,已經保證是在它正確的位置)再對那兩部分,再進行劃分。知道劃分為乙個乙個單獨的資料,此時,所有記錄已經是排好序了。
複雜度分析:
快速排序的時間效能取決於快速排序遞迴的深度。我們假設在最優情況下,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...