第四章 分治 快排 題目 求前k大的數

2021-10-23 06:23:05 字數 1288 閱讀 5476

給定乙個陣列包含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.令人困惑的標籤 對於自己標記積極的描述,但是對於物件不願意就範的話,則會...