著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 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
pivot:樞軸/中心點。其實pivot應該就是我們所說的快排中的 「哨兵」。快排中,任選乙個元素為哨兵,然後對於其他的元素,小於哨兵的移動到哨兵的左邊,大於的則挪到右邊。#include#include#includeusing namespace std;其實在這裡,可以對於每乙個元素左邊和右邊分別sort(),然後比較這個元素是否大於左邊的最大值並且小於右邊的最小值。但是這樣做肯定會超時!!!所以必須換種思路。
我們可以先對整個序列sort(),然後把原序列的每乙個元素與排序後的新序列進行比較:
1. 設乙個變數max=0.
2. 1)比較排序前的元素和排序後元素的位置是否是一樣的(快排的哨兵在一次快排後在序列中的位置和序列進行完整排序後是一致的呦~,因為哨兵大於它前的所有元素的最大值,且小於它後邊所有元素的最小值!); 2)排序前的元素》max嗎?如果 1)、2)都符合,則它可以是哨兵
3. 如果 迴圈到的 (未排序)序列的元素 > max,max=此元素~
int main()
sort(v2.begin(),v2.end());
for(int i=0;imax)
if(v1[i]>max) max=v1[i];
} printf("%d\n",cnt);
for(int i=0;i0) printf(" ");
printf("%d",v3[i]);
} cout《無了
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。則 ...