定義:
在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。
步驟:
1.在序列中選擇乙個關鍵元素作為軸;
2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上;
3.遞迴地對兩個子串行進行重新排序:含有較小元素的子串行和含有較大元素的子串行。
從上圖可以看出,每次的比較選取的key元素為序列最後的元素。
c語言實現:
#include #include void swap(int *x,int *y)
int choose_pivot(int i,int j )
void quicksort(int list,int m,int n)
// 交換兩個元素的位置
swap(&list[m],&list[j]);
// 遞迴地對較小的資料序列進行排序
quicksort(list,m,j-1);
quicksort(list,j+1,n);
}}void printlist(int list,int n)
{ int i;
for(i=0;i總結:
快速排序的時間主要耗費在劃分操作上,對長度為k的區間進行劃分,工需要劃分k-1次關鍵字的比較。
最壞的情況:每次劃分選取的基準(關鍵元素)都是當前無序區間中最小(或者最大)的記錄,劃分的結果就是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另外乙個非空子區間中記錄的數目,僅僅比劃分前的無序區中記錄的個數少乙個。時間複雜度為:o(n*n)
最好的情況:每次劃分所取的基準都是當前無序區的「中值」記錄,劃分的結果是基準的左右兩個無序區的長度大致相等。時間複雜度為:o(n*lgn)
儘管快速排序的最壞時間複雜度為o(n*n),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快的,平均時間複雜度為o(n*lgn)。
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...
排序 快速排序
高快省的排序演算法 有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它...