對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o(n^2)的排序演算法。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好:它的期望時間複雜度是o(nlgn),而且o(nlgn)中隱含的常數因子非常小。
與歸併排序一樣,快速排序也使用了分治思想。下面是對乙個典型的子陣列a[p…r]進行快速排序的三步分治過程:
分解:陣列a[p…r]被劃分為兩個(可能為空)子陣列a[p…q - 1]和a[q + 1…r],使得a[p…q - 1]中的每個元素都小於等於a[q],而a[q]也小於等於a[q + 1…r]中的每個元素。其中,計算下標q也是劃分過程的一部分。
解決:通過遞迴呼叫快速排序,對子陣列a[p…q - 1]和a[q + 1…r]進行排序
合併:因為子陣列都是原址排序的,所以不需要合併操作:陣列a[p…r]已經有序。
void
quiksort
(int
* a,
int l,
int r)
}
排序陣列a時初始應呼叫quiksort(a,1,n)
下面是重點陣列的劃分
int
partition
(int
* a,
int l,
int r)
}int ret = i +1;
int res = a[r]
; a[r]
= a[ret]
; a[ret]
= res;
return ret;
}
partition總是選擇乙個x = a[r]作為主元,並圍繞它來劃分陣列a[p…r]。隨著程式的執行,陣列被劃分成4個(有可能為空的)區域。在3~12行的for迴圈的每一輪迭代的開始,每乙個區域都滿足一定的性質。我們將這些性質作為迴圈不變數:
在3~12行迴圈體的每一輪迭代開始時,對於任意陣列下標k,有:
1.若p<=k<=i,則a[k]<=x。
2.若i+1<=k<=j-1,則a[k]>x。
3.若k=r,則a[k]=x。
快速排序的改良:隨機化快速排序
快速排序的應用:區間第k大
喜聞樂見的源**時間
//快速排序
#include
using
namespace std;
inline
intls
(int x)
inline
intrs
(int x)
inline
intfather
(int x)
constexpr
int maxn =
200;
constexpr
int inf =
0x3f3f3f3f
;int n, n;
int a[maxn]
;int
partition
(int
* a,
int l,
int r)
;void
quiksort
(int
* a,
int l,
int r)
}int
partition
(int
* a,
int l,
int r)
}int ret = i +1;
int res = a[r]
; a[r]
= a[ret]
; a[ret]
= res;
return ret;
}int
main()
quiksort
(a,1
, n)
;for
(int i =
1; i <= n; i++
) cout << endl;
return0;
}
輸入
8輸出2 8 7 1 3 5 6 4
1 2 3 4 5 6 7 8
演算法導論 快速排序實現
package search 快速排序演算法導論 public class quicksort1 quicksort1 q new quicksort1 q.quicksort arr,0,arr.length 1 q.print1 arr 合併 public void quicksort int ...
快速排序 演算法導論
對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 的排序演算法。雖然最壞情況時間的複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好 它的期望時間複雜度是o nlgn 而且o nlgn 中隱含的常數因子非常小,另外,它還能夠進行原址排序,甚至在虛存環...
演算法導論 快速排序
既然敢叫 快速排序 必然有其過人之處。事實上,它確實是最快的通用內部排序演算法。它由hoare於1962年提出,相對歸併排序來說不僅速度快,並且不需要輔助空間。對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度差,但是快速排序通常是實際排...