快排的思想求第K小的數

2021-07-14 19:09:00 字數 1099 閱讀 9024

描述輸入n

個數,m

次查詢。

每次查詢給出乙個數x。

要求:每次查詢輸出前

x個數中第

i小的數。(i為第

i次查詢)

你可以假設

m  <= n

,xi <= xi+1 <= xi+2 <= ……. <= xm (xm <= n).

輸入

line0:t

line1: n,m

line2…linen+1:num1,......,numn

linen+2…linen+2+m:x1,……,xm

n < 30000, num < 2000000000

輸出每次查詢輸出前i小的數,單獨一行。

詳細格式請參考樣例。

樣例輸入

1

7 43 1 -4 2 8 -1000 2

1 2 6 6

樣例輸出

331

2

可以根據快排的思想確定第i小,思考快排的過程,每次進行一次劃分,數列左邊的數都小於標桿值,數列右邊的值都大於標桿值,這就已經可以確定標桿值是第r小,加入求第k小,如果rk,則在右半部分找,每次去掉一半,這是減治法的思想,複雜度為log2 n

#include #include using namespace std;

int mypartition(int arr,int start,int dest);

int quicksort(int arr,int start,int dest,int k);

int main()

{ #ifdef local_debug

freopen("input.txt","r",stdin);

#endif // local_debug

int t;

scanf("%d",&t);

while(t--)

{int n,m;

scanf("%d%d",&n,&m);

for(int i=0;ik)

return quicksort(arr,start,middle-1,k);

if(middle

快排擴充套件 第k小的數

使用快排中的partition方法,可以很快找到乙個無序序列中的第k小的數。思想 對於乙個陣列a 0.n 1 分段成a 0.st 1 a s a st 1.n 1 分組後,a 0.st 1 裡面的元素都小於等於a st a st 1.n 1 裡面的元素都大於等於a st 所以,如果 st k 1,那...

尋找第K大的數(快排思想)

使用快排思想找第k大的數,演算法複雜度o n 1.以陣列a的第0位a 0 為參考基準base,將陣列劃分為兩個部分 如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準b...

基於快排思想的第 前 k大 小

演算法思路就是根據快排的partition,先隨機選擇乙個分隔元素 或a 0 將陣列分為 小於a p 的元素 a p 大於a p 的元素 如果這時候n p 1等於k的話,a p 就是所求的第k大,否則如果n p 1 k,那麼說明第k大元素應該是在 大於a p 的元素 裡,所以再partition這部...