快速排序,顧名思義就是速度很快的排序,平均時間複雜度僅為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 利用代入法可以求...