PAT B1045 快速排序 25

2021-08-02 04:34:31 字數 1318 閱讀 5786

著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。

給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?

例如給定n = 5, 排列是1、3、2、4、5。則:

1的左邊沒有元素,右邊的元素都比它大,所以它可能是主元; 儘管3的左邊元素都比它小,但是它右邊的2它小,所以它不能是主元;

儘管2的右邊元素都比它大,但其左邊的3比它大,所以它不能是主元; 類似原因,4和5都可能是主元。 因此,有3個元素可能是主元。

輸入格式:

輸入在第1行中給出乙個正整數n(<= 105); 第2行是空格分隔的n個不同的正整數,每個數不超過109。

輸出格式:

在第1行中輸出有可能是主元的元素個數;在第2行中按遞增順序輸出這些元素,其間以1個空格分隔,行末不得有多餘空格。

輸入樣例:

5 1 3 2 4 5

輸出樣例:

3 1 4 5

思路:第一次用暴力迴圈,超時了四個,得14分。之後想起排序後進行比較,雖然保證了主元的位置確定,但不敢說在其前的元素一定不會出現在後面。

想到了與前元素比較,將前乙個a[i]=b[i]的從i+1處往後分別與a[j]比較,用了for迴圈,還是各種超時(怒),最後用max才得以解決

# include

# include

using

namespace

std;

const

int maxn=100010;

int main();

int b[maxn]=;

int judge[maxn]=;

scanf("%d",&n);

for(int i=0;iscanf("%d",&a[i]);

b[i]=a[i];

}sort(b,b+n);

for(int j=0;jif(a[j]>max)

max=a[j];//此處用for迴圈極易超時

if(a[j]==b[j]&&a[j]==max)//思路就是排序前後主元位不變,且保證主元大於排在前面的所有數字

}printf("%d\n",cnt);

for(int h=0;hif(judge[h]==1)

}printf("\n");//沒有回車也會報錯

return

0;}//巢狀迴圈一定會超時

PAT B 1045 快速排序 25

題目鏈結在此。結合這道題一起看。思路其實已經在題幹中給出了,關鍵點就在如何表達這個 思路 上。如果暴力判斷的話,肯定是超時的。將題幹思路再深入一層 要判斷乙個點可不可能是主元,主要判斷它左邊的數都小於它,它右邊的數都大於它。它左邊的數小於它深入一層就是它左邊最大的數都小於它 同理,右邊的數都大於它深...

PATB1045 快速排序(25)

知識點筆記 用兩個陣列leftmax和rightmin,leftmax i 和rightmin i 分別表示i左邊最大的數和i右邊最小的數,這樣一來,判斷a i 是不是主元,只需要判斷a i leftmax i a i ac include include include using namespa...

PAT B1045 快速排序

513 245314 5本題需要使用乙個技巧,先記錄每個位上之前出現過的最大數,以及每位上之後出現過的最小數,再遍歷整個陣列,如果當前數比之前的數大,比之後的數小,則為主元。const int inf 0x3fffffff 定義了乙個很大的數 注意本題結束後必須要有換行,否則有個測試點會報格式錯誤 ...