测试点2详解:1045 快速排序 (25分)——23行代码满分
立志用更少的代碼做更高效的表達(dá)
Pat乙級(jí)最優(yōu)化代碼+題解+分析匯總——>傳送門(mén)
著名的快速排序算法里有一個(gè)經(jīng)典的劃分過(guò)程:我們通常采用某種方法取一個(gè)元素作為主元,通過(guò)交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分后的 N 個(gè)互不相同的正整數(shù)的排列,請(qǐng)問(wèn)有多少個(gè)元素可能是劃分前選取的主元?
 
 例如給定 N=5N = 5N=5, 排列是1、3、2、4、5。則:
 
 1 的左邊沒(méi)有元素,右邊的元素都比它大,所以它可能是主元;
 盡管 3 的左邊元素都比它小,但其右邊的 2 比它小,所以它不能是主元;
 盡管 2 的右邊元素都比它大,但其左邊的 3 比它大,所以它不能是主元;
 類似原因,4 和 5 都可能是主元。
 因此,有 3 個(gè)元素可能是主元。
輸入格式:
 輸入在第 1 行中給出一個(gè)正整數(shù) N(≤10^?5); 第 2 行是空格分隔的 N 個(gè)不同的正整數(shù),每個(gè)數(shù)不超過(guò) 10^9 。
輸出格式:
 在第 1 行中輸出有可能是主元的元素個(gè)數(shù);在第 2 行中按遞增順序輸出這些元素,其間以 1 個(gè)空格分隔,行首尾不得有多余空格。
輸入樣例:
 5
 1 3 2 4 5
 輸出樣例:
 3
 1 4 5
解題思路
研究樣例后發(fā)現(xiàn)(或者基于快排的原理):如果一個(gè)數(shù)是主元,那么在排好序的數(shù)列中,它也一定在相同的位置。 換句話說(shuō),排序后的數(shù)列與排序前的數(shù)列主元位置不變。
進(jìn)一步思考極端樣例: 輸入5, 5 4 3 2 1 我們會(huì)發(fā)現(xiàn),3的位置也沒(méi)有變,但3不是主元, 因此還應(yīng)加一個(gè)限制條件,也就是數(shù)字3前面的所有數(shù)字都比它小。
測(cè)試點(diǎn)2:為極端情況,也就是主元個(gè)數(shù)為0,如果出現(xiàn)了格式錯(cuò)誤,考慮是否輸出了兩個(gè)換行。
代碼展示
#include<bits/stdc++.h> using namespace std; int a[100010], b[100010], c[100010]; int main() {int n; cin>>n;for(int i = 0; i < n; i++) {cin >> a[i]; b[i] = a[i];}sort(a, a+n);int Max = -1, num = 0;for(int i = 0; i <n; i++) {if(b[i] > Max) Max = b[i];if(a[i] == b[i] && Max == b[i]) c[num++] = a[i];}cout << num << '\n';for(int i = 0; i < num; i++) {if(i != 0) cout << ' ';cout << c[i];} cout << '\n';return 0; }耗時(shí)
吐槽:手寫(xiě)快排竟然會(huì)超時(shí),看來(lái)還是algorithm香~
 
每日一句
我這輩子一直都在推遲那些我以為我之后會(huì)有時(shí)間做的事情,但敞開(kāi)的門(mén)不會(huì)一直敞開(kāi)。 ??——Karl
總結(jié)
以上是生活随笔為你收集整理的测试点2详解:1045 快速排序 (25分)——23行代码满分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 测试点2和测试点4错的来:1044 火星
 - 下一篇: 【C语言】满分:1047 编程团体赛 (