快速排序是最壞情況時間複雜度為o(n²),最優時間複雜度為o(nlgn),平均時間複雜度為o(nlgn)。
最壞情況出現在每一層劃分子問題時,分別包含了n-1個元素和0個元素,此時的時間複雜度為o(n²),與插入排序相同;在陣列已經有序時其時間複雜度依舊為o(n²),此時插入排序的時間複雜度為o(n)。
快速排序使用了分治思想,將陣列a[p..r]劃分為兩個子陣列a[p..q-1]和a[q+1..r],使a[p..q-1]中的元素都小於a[q],a[q+1..r]中的元素都大於a[q],不斷進行遞迴這個過程,直到陣列中只存在乙個元素,此時,陣列已經有序。
quicksort(a,p,r)
if p < r //當陣列中只剩乙個元素時,退出遞迴,陣列已經有序
q = partition(a,p,r)
quicksort(a,p,q-1) //對小於等於a[q]的元素進行遞迴
quicksort(a,q+1,r) //對大於a[q]的元素進行遞迴
劃分陣列:
partition(a,p,r)
x = a[r] //將a[r]選取為「主元」
i = p - 1 //因為可能不存在小於等於a[r]的元素,所以i的值由p-1開始
for j = p to r-1
if a[j] <= x
i = i + 1 //小於等於x的元素增加乙個
exchange a[i] with a[j] //i+1後,i指向了乙個大於x的元素,此時,j指向的是乙個小於等於x的元素,交換這兩個元素的位置,使其符合規則
exchange a[i+1] with a[r] //r前所有元素比較完後,將a[r]置於正確位置:兩個子陣列的交界處
return i + 1 //返回"主元"的位置
在整個for迴圈過程中,陣列被劃分為了四個區域:
1.小於等於a[r],元素位於[p,i]
2.大於等於a[r],元素位於(i,j)
3.未劃分區域 [j,r)
4.主元 [r,r]
demo:
#include #include using namespace std;
void swap(int *a,int *b)
int partition(int *a,int p,int r)
} swap(a[r],a[i+1]);
return (i + 1);
}void quicksort(int *a,int p,int r)
}int main()
演算法導論讀書筆記(7)快速排序
與歸併排序一樣,也使用了分治思想 quick sort a,p,r if p r q partition a,p,r quick sort a,p,q 1 quick sort a,q 1,r 演算法的關鍵部分是partition過程,它實現了對子陣列a p.r 的原址重排。partition總是選...
演算法導論 讀書筆記 排序演算法總結
排序演算法目錄 1.插入排序 2.歸併排序 3.堆排序 4.快速排序 5.計數排序 6.基數排序 7.桶排序 一.插入排序 1.第乙個元素認為已經排好序了 2.從第二個元素開始考慮,考慮第j個元素 3.從後往前比較,前面數大於第j個元素,則往後挪乙個位置 4.挪到數小於第j個元素,或者挪完,此時因為...
讀書筆記 演算法導論
第2章演算法入門 浮於表面不如深入其中,送給自己,自己是最大的敵人,那麼就盡最大努力去克服自己,沉思,冷靜,不浮躁!勘誤 在演算法導論第9頁,扼要的扼 內容提要 1 偽 的表示方法 2 插入排序演算法分析 3 迴圈不變式 4 演算法設計之分治法 divide and conquer 5 合併排序演算...