1045 快速排序 25分

2021-10-23 00:26:05 字數 1313 閱讀 8299

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

本題解法與快速排序無關。

(方法一)直接暴力法(會超時,只能得20分)

直接判斷第i個元素的左邊是否有比他大的元素或者右邊有比他小的元素,如果有,則不是主元。

#include#includeusing namespace std;

bool flag[100010];

int main()

}} }

int num[100010],k=0;

for(int i=0;i(方法二)

建立陣列leftmax陣列記錄序列a的每一位左邊的最大值,陣列rightmin記錄每一位右邊最小值。leftmax[i]表示a[0]~a[i-1]中的最大值,顯然leftmax[0]==0。從左到右遍歷序列a。由於leftmax[i-1]記錄了a[0]~a[i-1]的最大值。如果a[i-1]比leftmax[i-1]大,說明leftmax[i]於a[i-1],如果a[i-1]比leftmax[i-1]小,則說明leftmax[i]等於leftmax[i-1]。同理可以獲得rightmin[i]。

遍歷序列a,若leftmax[i]比a[i]小,並且rightmin[i]比a[i]大,則a[i]是主元。

#include#includeusing namespace std;

const int maxn=100010;

const int inf=0x3fffffff;

int main()

int count[maxn],j=0;

for(int i=0;ia[i])

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

for(int i=0;i(1)快速排序演算法:

void quicksort(int r,int low,int high)

if(i(2)當主元個數為零時,第二行雖然沒有輸出主元,但必須輸出乙個換行。

1045 快速排序 (25 分)

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

1045 快速排序 (25 分

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

1045 快速排序 25分

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