演算法 快速排序

2022-08-19 01:15:14 字數 1458 閱讀 3141

快速排序,顧名思義就是速度很快的排序,平均時間複雜度僅為o(n * log2(n))。

洛谷1177 排序

題目描述

將讀入的 n 個數從小到大排序後輸出。

輸入格式

第 1 行為乙個正整數 n。

第 2 行包含 n 個空格隔開的正整數 a[i],為你需要進行排序的數,資料保證了a[i]不超過10^9。

輸出格式

將給定的 n個數從小到大輸出,數之間用空格隔開。

輸入輸出樣例

輸入

5

4 2 4 5 1

輸出

1 2 4 4 5
說明提示

對於20% 的資料,有 n <= 10^3。

對於100% 的資料,有 n <=10^5 。

快排是一種經典的分治演算法,而分治演算法最重要的三個步驟:

分解:將原序列拆成前後兩個序列(a[l] ~ a[mid]和a[mid + 1] ~ a[r]),之後將小於a[mid]的元素都扔到前面的序列,大於a[mid]的元素都扔到後面的序列。

解決:用遞迴分別再去用快速排序去解決前後兩個序列。

合併:遞迴回來的就是結果了,不用再合併。

這裡具體說一下分解的時候,首先要設定乙個分界值key,我喜歡取中間數的值。之後從後往前找到第乙個比分界值小的數a[t2],從前往後找到第乙個比分界值大的數a[t1],讓這兩個數交換;接著再從(t2 - 1)開始往前找到第乙個比分界值小的數更新t2的值,從(t1 + 1)開始往後找到第乙個比分界值大的數更新t1的值,再讓這a[t1]和a[t2]兩個數交換…………就這樣迴圈下去直到t1 >= t2結束。

簡而言之,就是找乙個數,小的放我前面,大的放我後面。

這樣就保證了在此時的a[mid]前面的數都比key小,後面的都比key大,之後再分別對a[l] ~ a[t2]和a[t1] ~ a[r]這兩個子串行執行如上操作。如此迴圈往復,就讓整體的序列越來越有序,直到最後變為乙個單調序列。

最後算一下這個演算法的時間複雜度:每次拆分是log2(n)次,更新序列是n次,所以平均時間複雜度是o(n * log2(n))級別。

# include # include # include # include using namespace std;

const int n_max = 100000;

int n;

int a[n_max + 10];

void quicksort(int l, int r)

while(t1 <= t2);

quicksort(l, t2);

quicksort(t1, r);

}int main()

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...