方法:有兩種。參見:
第一種:使用排序(快速排序),將陣列排序後,第k大的數就在第k個位置上。演算法複雜度:o(n*logn)
第二種:類似快速排序的變種。通過二分的思想,找到第k大的數字,而不必對整個陣列排序。
從陣列中隨機選乙個數t,通過讓這個數和其它數比較,我們可以將整個陣列分成了兩部分並且滿足, < 。
在將陣列分成兩個陣列的過程中,我們還可以記錄每個子陣列的大小。這樣我們就可以確定第k大的數字在哪個子陣列中。
然後我們繼續對包含第k大數字的子陣列進行同樣的劃分,直到找到第k大的數字為止。
平均來說,由於每次劃分都會使子陣列縮小到原來1/2,所以整個過程的複雜度為o(n)。
public class findkthmax ;
int k=3;
find(array,0,array.length-1,k-1);
}public static void find(int array,int left, int right,int k)
int i=left;
int j=right+1;
int key=array[left];
while(true)while(i<=right&&array[i]>key);
dowhile(j>=left&&array[j]if(jint tmp=array[i];
array[i]=array[j];
array[j]=tmp;
} int tmp=array[left];
array[left]=array[j];
array[j]=tmp;
if(j==k)
if(kfind(array,left,j-1,k);
else
find(array,j+1,right,k); }
}
執行結果:the 3th max number is:4
找陣列中第k大的數
但會修改陣列中的資料,所以這裡有新的不修改資料的思路 1 用multiset實現自動排序,大小為k,每個數與set中最大的數比較,如果小於則替換。2 可以用最大堆來實現,方法類似上面的。關鍵是看 注釋在下面。時間複雜度為 include include includeusing namespace ...
求陣列中第K大的數
本題的的陣列是可以包含重複元素的,且要求時間複雜度控制在o n 解題思路 陣列中第k大的數等價於排序陣列中第n k個數,直觀的想法是將陣列排序後取第n k個數即可,但是最快的排序演算法時間複雜度也是o nlogn 可以參考快速排序一次劃分的思想,將時間複雜度降低為o n 一次劃分可以講陣列分為三部分...
求陣列中第k大的數
文章裝載自 使用快排,第一趟快排過後,右邊的元素都比樞軸大,左邊的都比樞軸小。當我們要求第k大的數,只需要左邊的元素個數是len k,len是陣列總長度。第一次快排下來,設樞軸位置是mid,如果mid k,說明第k大元素應該在左邊序列中,遞迴左邊序列。當 mid k 時,說明k元素在右邊序列,遞迴右...