著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?
例如給定 $n = 5$, 排列是1、3、2、4、5。則:
因此,有 3 個元素可能是主元。
輸入在第 1 行中給出乙個正整數 n(≤105); 第 2 行是空格分隔的 n 個不同的正整數,每個數不超過 109。
在第 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。則 ...