對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o(n²)的排序演算法。雖然最壞情況時間的複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好:它的期望時間複雜度是o(nlgn),而且o(nlgn)中隱含的常數因子非常小,另外,它還能夠進行原址排序,甚至在虛存環境中也能很好的工作。
快速排序使用了分治的思想:
分解:將陣列a[low..high]劃分為兩個子陣列a[low..mid - 1]以及a[mid + 1..high],使得a[low..mid - 1]子陣列中的元素小於a[mid],而在a[mid + 1..high]中的元素都大於a[mid]元素,返回mid位置;
解決:通過遞迴呼叫快速排序,對子陣列繼續進行排序;
合併:因為子陣列是按照原址排序的,故不需進行合併:陣列已經有序。
其中分解:
進行原址重排:
如對陣列a =進行快速排序;
在partition進行原址重排:
以最後乙個元素為x = 4,淺灰色部分是<=x,深灰色部分則是》x;第一輪排序到此為止;
繼續執行quicksort,直到p >= r為止(即low >= high);
**:
#include #include #include using namespace std;
void swap(int &m, int &n) //交換
int partition(int *a, int low, int high)
}swap(a[i + 1], a[high]); //交換
return i + 1; //返回基準下標
}void quicksort(int *a, int low, int high)
}int main()
; int length = sizeof(a) / sizeof(int) - 1; //
quicksort(a, 0, length); //進行排序
cout<
for(int i = 0; i <= length; i++) //輸出排列結果
演算法導論 快速排序
既然敢叫 快速排序 必然有其過人之處。事實上,它確實是最快的通用內部排序演算法。它由hoare於1962年提出,相對歸併排序來說不僅速度快,並且不需要輔助空間。對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度差,但是快速排序通常是實際排...
《演算法導論》 快速排序
最近和朋友聊天,聊到企業面試時考了一道鍊錶的快排,這道題在leetcode上也刷到過,而且對於陣列的快排,真是從大學到研究生一直都要求必須掌握的重點知識,然而自己不斷的思考,卻發現所謂的快排,比我以前想象的要複雜的多,因為快排的思想非常幹練,但是形式,或者說具體實現千變萬化,為了達到萬變不離其宗,筆...
演算法導論 快速排序
昨天阿里3面,被問了快速排序,我看看之前的部落格,這個排序漏了 快排的基本思想 1.分而治之的思路,選取乙個哨兵節點 2.將小於key的元素放在哨兵的左邊,將大於key的元素放在右邊 快排的時間複雜度為on logn 最差的情況為o n2 即所有元素都是有序的。每次只能走一位元素。快排是不穩定的演算...