給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小輸
出。輸入:
第一行包含乙個整數n,表示陣列的大小。n < 100000。
第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開
。每個整數的絕對值不超過100000000。
第三行包含乙個整數m。m < n。
輸出:從大到小輸出前m大的數,每個數一行
思路:最直接的利用c++自己的快排函式,但是這裡介紹一下自己寫的快排如何優化。
優化點:將前k的數都移到陣列的右邊,但不需要保證這些前k大的數之間是有序的。然後再對右邊的k個數進行快排。
如何將前k大的都弄到最右邊:arrangeright操作
1)設key=a[0], 將key挪到適當位置(利用快排的思想),使得比key小的元素都在
key左邊,比key大的元素都在key右邊(線性時間完成)
2) 選擇陣列的前部或後部再進行 arrangeright操作-----降低了快排裡面的兩邊都要進行
void
arrangeright
(int a,
int s,
int e,
int k)
//key值下標更換,但最後下標是i!!!!,可自己畫圖跟蹤。
//如果右邊的數剛好為e-i+1為k個
if(k == e - i +1)
return
;//右邊的數大於k個
else
if(k < e - i +1)
//右邊的數小於k個,需要左邊取出k - (e-i+1)個
else
}
快排**:
void
quicksort
(int a,
int l,
int r)
swap
(a[i]
,a[j]);
while
(j>i&&a[j]
>=k)
swap
(a[i]
,a[j]);
}//每次排序都保證了乙個數的位置i,使左邊的數都比這個數小,右邊的都比這個數大
quicksor
(a,l,i-1)
;quicksort
(a,i+
1,r)
;}
****:**快排和歸併的區別
快排是從大到小(遞迴實現),歸併是從小到大(遞迴實現),快排的定位,歸併是捋順
第四章 迴圈結構的程式設計 1090 含k個3的數
1090 含k個3的數 時間限制 1000 ms 記憶體限制 65536 kb 提交數 25332 通過數 15085 題目描述 輸入兩個正整數m和k,其中1 輸入 m 和 k 的值,中間用單個空格間隔。輸出 滿足條件時輸出 yes,不滿足時輸出 no。輸入樣例 43833 3 輸出樣例 yes思路...
演算法第四章上機實驗的 刪數問題
4 2 刪數問題 30 分 給定n位正整數a,去掉其中任意k n 個數字後,剩下的數字按原次序排列組成乙個新的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最小的刪數方案。如果數字最前面有0不輸出。第 1 行是1 個正整數 a。第 2 行是正整數k。輸出最小數。在這...
第四章 製造迷霧(fog)的四大手法
2.把責任推給受害者 3.聯合陣線 4.消極比較 他們會粉飾自己的人格特質以及行為動機,讓人看起來特別高尚 至於我們自己的行為,則在勒索者面前汙穢不堪。會把自己的需求說的光明正大,理所應當,如果一開始就是錯的,一定會錯下去。2.令人困惑的標籤 對於自己標記積極的描述,但是對於物件不願意就範的話,則會...