題目:著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 n
個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?
例如給定 , 排列是1、3、2、4、5。則:
因此,有 3 個元素可能是主元。
輸入在第 1 行中給出乙個正整數 n
(≤105); 第 2 行是空格分隔的 n
個不同的正整數,每個數不超過 109。
在第 1 行中輸出有可能是主元的元素個數;在第 2 行中按遞增順序輸出這些元素,其間以 1 個空格分隔,行首尾不得有多餘空格。
51 3 2 4 5
31 4 5
方法思路:
直接思路(也即暴力方法):對每乙個位置元素,向左排查是否有元素大於它,有就標記此元素非主元;左邊滿足都不大於此元素的情況下,向右排查是否有右邊的元素小於它,同樣有就標記此元素非主元;
此演算法複雜度:對n個元素輸出其中的非主元元素,每乙個元素都要和其餘的n-1個元素進行比較,複雜度為o( n*(n-1) ) = o( n^2 )
暴力演算法在這題上提交會超時。
更快演算法:
考察序列1: 375810 排序後: 35
7810
可以觀察到如果是主元元素,其排序後的位置和排序前的位置一樣,如 3, 8 ,10,而 5 和 7 都不是主元。
考察序列2: 128435
排序後: 12
3485
序列2 裡 數4排序前和排序後的位置一樣,但是數4卻不是主元,因為前面5比它,後面3又比它小,顯然不是主元。
所以僅僅滿足排序前後排序後位置一樣而得出是主元的結論是不夠的。
觀察可以得到在這個序列裡只有 1 和 2 是主元, 8 ,4,3 ,5都不是主元。
數5因為和排序後位置上的8不等,所以不是主元;
而對於數4,考察其位置,從序列開始到其位置的所有數中最大值應該是8,先不管4後面的數,我們知道在某乙個位置對其前面所有元素來說最大值應該在此位置上,因為主元的左邊都比它小。而數4前面有了比它大的數,所以數4就不是主元。同樣數5也是一樣的,對於數5位置來說,從序列開始到其位置的所有數中最大值也是8,即數5前面有了比它大的數,所以數5不是主元。
對於位置 i 來說 已經滿足其前面到此位置的所有數中的最大值在此位置上了,難道就不怕此位置後面有比其小的元素嗎?
綜上,可以得到判斷是主元的兩個條件:
考察陣列中某位置1.排序前此位置上的數和排序後此位置上的數相等
2.此位置上的數也必須是從序列開始到此位置上的最大值
示例**:
1 #include2 #include3using
namespace
std;4
5const
int maxn = 100010;6
int a[maxn];//
原陣列7
int pivot[maxn] = ;//
主元陣列
8int a_sorted[maxn];//
對原陣列排序後的陣列9
10int
main()
1119 sort(a_sorted,a_sorted + n); //
對原陣列進行排序20
21int max_num = 0;22
23for(int i=0;i)30
31 printf("
%d\n
",pivot_num);
32if(pivot_num > 0
)33 printf("
%d",pivot[0
]);34
for(int i=1;i)
37 printf("\n"
);38
return0;
39 }
時間複雜度分析
:sort排序o(nlogn),乙個迴圈順序掃瞄o(n),總的時間複雜度o(nlogn+n)
參考:[pat b1045](
[[1045. 快速排序](
PAT B1045 快速排序
513 245314 5本題需要使用乙個技巧,先記錄每個位上之前出現過的最大數,以及每位上之後出現過的最小數,再遍歷整個陣列,如果當前數比之前的數大,比之後的數小,則為主元。const int inf 0x3fffffff 定義了乙個很大的數 注意本題結束後必須要有換行,否則有個測試點會報格式錯誤 ...
PAT B 1045 快速排序 25
題目鏈結在此。結合這道題一起看。思路其實已經在題幹中給出了,關鍵點就在如何表達這個 思路 上。如果暴力判斷的話,肯定是超時的。將題幹思路再深入一層 要判斷乙個點可不可能是主元,主要判斷它左邊的數都小於它,它右邊的數都大於它。它左邊的數小於它深入一層就是它左邊最大的數都小於它 同理,右邊的數都大於它深...
PAT B1045 快速排序 25
著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定n 5,排列是1 3 2 4 5。則 1的左邊沒有元素,右邊...