用快速排序的思想輸出陣列第k大的元素:
1 #include2 #include3using
namespace
std;45
//遞迴實現:返回陣列第k大的值.陣列下標區間是[begin,end].其中陣列假定n個元素,則k的值在區間[1,n]. 6//
能夠使用這種方法的前提條件是:n個數不能重複。如果n個數中有重複,那麼區間的大小不能保證就是第k大。
7int findkth(int* arr, int begin, int end, intk)8
18 arr[i]=key;
1920
//遞迴的結束條件為某一記錄剛好劃分到第k個位置
21//
由於陣列從0開始,所以需要加1了
22if (i == k-1)return
arr[i];
23else
if (i < k-1) return findkth(arr, i+1
, end, k);
24else
return findkth(arr, begin, i-1
, k);25}
2627
28//
只做了一輪劃分,沒有遞迴完成快速排序.返回的是劃分的下標。陣列a下標區間[low,high]
29 template
30int partition(t a,int low,int
high)
3141 a[i]=key;
42return
i;43}44
45//
利用快速排序的思想查詢第k大的數值
46//
第乙個引數代表要查詢的陣列
47//
第二個引數代表陣列的長度
48//
第三個引數代表要查詢第幾大的元素
49//
非遞迴50 template
51 t findkth2(t a,int n,int
k)52
63else
if(pos>n-k)
6468}69
}7071int
main() 72;
74int b[11]=;
75int c[11]=;
7677
for(int i=0;i<11;i++) cout<"";
78 cout<79 sort(a,a+11
);80
for(int i=0;i<11;i++) cout<"";
81 cout<8283
for(int i=11;i>=1;i--)
84 cout<0,10,i)<<"";
85 cout<8687
for(int i=11;i>=1;i--)
88 cout<11,i)<<"";
89 cout<9091
92 cout93for(int i=0;i<11;i++) cout<"";
94 cout<95for(int i=0;i<11;i++) cout<"";
96 cout<97return0;
98 }
參考:
利用快速排序的特點:第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小(降序),當左邊區間大於k時,說明我們求的第k大數在左邊區間,這時我們可以捨棄右邊區間,將範圍縮小到左邊區間從而重複上述過程,直到確定乙個數的位置時,左邊區間的小是k-1那麼這個數字就是我們所求。右邊同理。
能夠使用這種方法的前提條件是:n個數不能重複。如果n個數中有重複,那麼區間的大小不能保證就是第k大。可以用hash判重來將重複的資料去掉。然後再使用上述方法。
1/*** created with intellij idea.
2* user: hqtc
3* date: 16-3-22
4* time: 下午9:52
5* to change this template use file | settings | file templates. 6*/
7public
class
quicksort
15if (low 16 nums[low++] =nums[high];
17while (k > nums[low] && low 20if (low 21 nums[high--] =nums[low];22}
23 nums[low] =k;
24return
low;25}
2627
public
void sort(int num, int low, int
high) 33}
3435
public
int findkthmax(int arr, int k, int left, int
right) else
else45}
46}47}
4849
/*50
5152
*/
陣列中第k大的元素
問題描述 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效...
尋找陣列中的第K大的元素
遇到了乙個很簡單而有意思的問題,可以看出不同的演算法策略對這個問題求解的優化過程。問題 尋找陣列中的第k大的元素。最簡單的想法是直接進行排序,演算法複雜度是o n logn 這麼做很明顯比較低效率,因為不要求別的資訊只要計算出第k大的元素。當然,如果在某種情況下需要頻繁訪問第k大的元素就可以先進行一...
陣列第K大
和第k小剛好相反 有乙個整數陣列,請你根據快速排序的思路,找出陣列中第k大的數。給定乙個整數陣列a,同時給定它的大小n和要找的k k在1到n之間 請返回第k大的數,保證答案存在。測試樣例 1,3,5,2,2 5,3 返回 2 先排序 快排 二分 第k大,則說明是第n k 1小 目的下標為n k 根據...