快速排序也是基於交換的原理進行的,是對氣泡排序的一種改進。即它是通過不斷比較和移動交換來實現排序的,只不過它的實現,增大了記錄的比較和移動的距離,將關鍵字比較大的記錄從前面直接移動到後面,關鍵字較小的記錄從後面直接移動到前面,從而減小了總的比較次數和移動次數。
快速排序是找出乙個元素(理論上可以隨便找乙個)作為基準(pivot),
然後對陣列進行分割槽操作
,從右至左開始調整,使基準左邊元素的值都不大於基準值,
基準右邊的元素值都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他
n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。
快速排序的時間主要耗費在劃分操作上,對長度為k
的區間進行劃分,共需
k-1次關鍵字的比較。
最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(
或最大)
的記錄,劃分的結果是基準左邊的子區間為空
(或右邊的子區間為空
),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。
時間複雜度為o(n*n)
在最好情況下,每次劃分所取的基準都是當前無序區的"中值"
記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:
o(nlgn)
儘管快速排序的最壞時間為o(n*n)
,但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。
它的平均時間複雜度為o(nlgn)。
#include
void qsort(int v, int left, int right);
int main()
int i;
int a[5]=;
qsort(a,0,4);
for(i=0;i<5;i++)
printf("%d ",a[i]);
puts("");
return 0;
void qsort(int v, int left, int right)
if(left
int key = v[left];
int low = left;
int high = right;//最好不要直接改變形參的值,所以附上另外的區域性變數。
while(low
while(low =key)//從右向左開始尋找比
key小的數
high--;
v[low] = v[high];//比
key小就交換
while(low
key大的數
low++;
v[high] = v[low];//比
key大就交換
v[low] = key;
qsort(v,left,low-1);//對小於基準的數既是位於基準左邊的數進行快排
qsort(v,low+1,right);//對大於基準的數既是位於基準右邊的數進行快排
2 4 9 3 6 7 1 5
首先用2
當作基準,即key=2,使用low,high兩個指標分別從兩邊進行掃瞄,把比2
小的元素和比
2大的元素分開。首先是從右至左開始掃面。
快速排序詳解
對於陣列s 2,1,3,0,4,5,8,7,1 進行排序 最好的情況是val每一次取到中間值,則複雜度為nlog n 最壞的情況是val每一次取到最小值或者最大值,則複雜度為n 2 include include include include include include include inc...
快速排序詳解
快速排序法詳解 快速排序法 quicksort 是一種非常快的對比排序方法。它也divide and conquer思想的實現之一。自從其產生以來,快速排序理論得到了極大的改進,然而在實際中卻十分難以程式設計出正確健壯的 本文將對快速排序演算法的基本理論和程式設計實踐方面做作乙個全面的講解。在本文講...
快速排序 詳解
注 如果下面不詳細,可以去這個連線看我記錄下的筆記 概念 快速排序其實是 二分 的應用。雖然類似於冒泡,但是它比冒泡的跳躍更大。樣例 int arr 10 第一步 確定arr 0 為基準數。第二步 先從最右邊 arr 9 開始讀取數字,讀到比基準數小的時候。再從基準數開始讀取。讀到比基準數大的時候,...