快速排序 演算法導論

2021-06-20 03:24:28 字數 1728 閱讀 4142

對於包含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 即所有元素都是有序的。每次只能走一位元素。快排是不穩定的演算...