1045 快速排序

2021-09-29 11:46:21 字數 1082 閱讀 9295

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

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

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

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

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

5

1 3 2 4 5

3

1 4 5

有題意可以知道,主元的判定方法,是該數值的左邊都比它小,該值的右邊都比它大。因此該題的暴力解法挺好寫,兩層遍歷,但是會超時。。。參考了別人**之後的方法,利用 sort 快排之後,判斷排序之後的位置有無變化。當發生改變的時候,可以確定其一定不能作為主元,因為遞增排序之後的結果,一定滿足該值的左邊都比它小,右邊都比它大。然後進一步判斷,該值是否比左邊的最大值要大。例如:[1, 7, 6, 2, 8],6 在經歷排序之後,其位置沒有發生移動,但其左邊 出現的值 7 比 6 大,所以 6 不能作為主元。同時注意,在結尾輸出空行。。。

方法一:暴力解法。

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

int n, num[100010] = ;

bool judge(int index)

for(int i=index+1;iv;

for(int i=0;i方法二:快排解法。

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

int main()

printf("%d\n",v.size());

for(int i=0;iprintf("\n");

return 0;

}

1045 快速排序

如果按照題目正常寫的話就只有第乙個點能通過,結果超時,後來觀察到可以和排好序的陣列比較,數字相等的時候才能算,但是也有一半的點是不能通過的,後來,想到了如果有兩個相同的數字,那麼在排序的過程中,兩個數字就是挨著的,那麼就沒辦法與未排序的陣列一一對應了,這樣就判斷一下,需要判斷的數字是否比之前的最大值...

1045 快速排序

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

1045 快速排序

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