#include
#include
#include
using
namespace std;
intpar
(vector<
int>
& v,
int l,
int r)
else
}swap
(v[i]
,v[r]);
return i;
}int
quickselectkth
(vector<
int>
&v,int l,
int r,
int k)
int p =
par(v,l,r)
;//這裡的par函式只能用l的,因為得到的v[p]左邊都是比它小的,右邊都是比它大的,h的則不可以,只是基於pivot分為兩半,v[p]不一定是pivot
int kth = p-l+1;
//這個是s-陣列的大小,不能直接用p,因為p是原陣列的下標,不是第幾小
if(kth == k)
return v[p]
;else
if(kth > k)
return
quickselectkth
(v,l,p-
1,k)
;else
return
quickselectkth
(v,p+
1,r,k-kth);}
intmain()
;int k =3;
int res =
quickselectkth
(v,0
,v.size()
-1,k);
cout
}
尋找單個無序陣列中第K小的數字
1 排序 對陣列進行排序 然後前k個元素就是需要查詢的元素,排序的方法可以採用快速排序,但是我們知道在快速 排序中如果已經是有序的陣列,採用快速排序的時間複雜度是o n 2 為了解決這種問題,通常選擇隨機選擇乙個 陣列值pivot作為基準,將陣列分為s1 pivot和s2 pivot,這樣就能避免快...
無序數字中位數 如何在無序陣列中查詢第K小的值
如題 給定乙個無序陣列,如何查詢第k小的值。例子如下 在乙個無序陣列,查詢 k 3 小的數 輸入 arr 輸出 7在乙個無序陣列,查詢 k 4 小的數 輸入 arr 輸出 10幾種思路如下和複雜度分析如下 1 最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k 1索引的值即可,時間複雜度為...
程式設計練習 求無序陣列第k小的數
為同寢的傢伙寫了乙個求乙個無序陣列中第k小數的程式。思想就是快排的思想。找乙個點,然後放到末尾,然後將小於這個數的值放在陣列前面,大於這個值的放在陣列後面,然後在將這個末尾的數放回。這個末尾數放入的位置i代表已經找到第i小的數。下面你應該明白了吧,放入的位置如果是k,恭喜你找到了第k小的數。同樣找到...