PAT乙級 1045 快速排序 25分

2021-10-07 09:21:54 字數 2571 閱讀 1687

著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?

例如給定 n=5

n = 5

n=5, 排列是1、3、2、4、5。則:

1 的左邊沒有元素,右邊的元素都比它大,所以它可能是主元;

儘管 3 的左邊元素都比它小,但其右邊的 2 比它小,所以它不能是主元;

儘管 2 的右邊元素都比它大,但其左邊的 3 比它大,所以它不能是主元;

類似原因,4 和 5 都可能是主元。

因此,有 3 個元素可能是主元。

輸入在第 1 行中給出乙個正整數 n(≤10​5​​ ); 第 2 行是空格分隔的 n 個不同的正整數,每個數不超過 10​9​​ 。

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

513245

314

5

先說一下坑點:如果主元數量為0的話,輸出0以後還要多輸出乙個空行。

我至少找到了三種解決辦法:

第一種就是對每個位置的數尋找左邊最大和右邊最小的數,通過維護兩個陣列,乙個是當前元素左邊最大的數的陣列,乙個是當前元素右邊最小的數的陣列。時間複雜度是o(n)

第二種方法是先排序,對每個排好序陣列和原陣列比較,如果同樣的位置上的數相同,並且比所有左邊是資料大,那麼就是主元。時間複雜度是o(nlnn)

第三種方法是不斷維護主元陣列,把資料乙個乙個地輸入,記錄最大值max。讀取下乙個數,若下乙個數比max大就放進主元陣列中,若下乙個數比max小,就把主元陣列中,所有比這個數小的主元踢出去。時間複雜度也是o(n),而且空間用的應該是最少的。

因為資料量比較小的原因(或者其他原因),這三種方法耗時都是差不多的。

//你可能發現我沒有對out陣列排序,因為out陣列一定是單調遞增

printf

(cnt?

"%d\n"

:"%d\n\n"

,cnt)

;//cnt是0的時候要多輸出乙個換行

for(

int i=

0;i++i)

printf

("%s%d"

,i?" ":""

,out[i]);

return0;

}

#include

#include

using

namespace std;

int n,num[

101000

],so[

101000

],out[

101000

],cnt,ma;

intmain()

sort

(so,so+n)

;for

(int i=

0;i++i)

printf

(cnt?

"%d\n"

:"%d\n\n"

,cnt)

;//cnt是0的時候要多輸出乙個換行

printf

("%s%d"

,i?" ":""

,out[i]);

if(cnt==0)

printf

("\n");

return0;

}

#include

#include

using

namespace std;

#define maxn 100005

int n,maxx,cnt,out[maxn]

,tmp;

intmain()

for(

int j = cnt-

1;j>=

0;j--

)//把主元陣列中,小於tmp的都踢掉

if(out[j]

>tmp)

cnt--

;else

break;}

//out陣列也沒必要排序,因為一定是從小到大排好了的

printf

(cnt?

"%d\n"

:"%d\n\n"

,cnt)

;for

(int i =

0;i)printf

("%s%d"

,i?" ":""

,out[i]);

}

PAT乙級 1045 快速排序 25

題目 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定n 5,排列是1 3 2 4 5。則 1的左邊沒有元素...

PAT乙級 1045 快速排序 25

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 cao,peng 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的n個互...

PAT乙級1045快速排序 25 分

著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n n n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 排列是1 3 2 4 5。則 因此,有...