描述輸入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小的數,單獨一行。
詳細格式請參考樣例。
樣例輸入
17 43 1 -4 2 8 -1000 2
1 2 6 6
樣例輸出
3312
可以根據快排的思想確定第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這部...