由無序陣列中找到第K 大的元素
阿新 • • 發佈:2019-02-01
當然如果我們想要實現這個問題會有很多思路,可以將原來的陣列進行排序即可,直接隨機訪問到第K個元素即可。
我們專門寫一篇部落格當然不是想利用這種思路的,可以試試改進的快速排序啊,對不,我個人覺得是利用了兩種思路一個是快速排序一個是二分查詢,在進行快速排序的時候,在指定範圍內找到該值的下標,如果該下標與K值相比比較大,則結束end=index-1,相反的話 start=index+1即可
當然因為是第K大,所以陣列應該是降序排列的
int a[]={7,9,8,5,6,3,2,4,1,0}; const int K=6; //解題思路就是利用快速排序,如果得到快速排序一次中間結果之後其所在位置即在 int QSort(int* a,int low,int high) { if(low<high) { int start=low,end=high; int key=a[start]; while(start<end) { while(start<end&&a[end]<key) { end--; } a[start]=a[end]; while(start<end&&a[start]>key) { start++; } a[end]=a[start]; } a[start]=key; return start; } return -1; } int main() { int start=0,end=sizeof(a)/sizeof(int)-1; int index=0; while(index!=K) { index=QSort(a,start,end); if(index<K) { start=index+1; } else if(index>K) { end=index-1; } } cout<<a[index]<<"即為所求\n"; }
由此還可以引申出另一個 問題的解決方案,,也即最小的K個數
其思路就跟快速排序是一樣的,只是將陣列進行升序排列,然後,找到位於第K小的元素,那麼該元素之前的所有元素都比這個小,也就找到了最小的K個元素,但是不一定是排序的