陣列中第k大的數

2021-08-31 10:52:39 字數 1009 閱讀 9490

方法:有兩種。參見:

第一種:使用排序(快速排序),將陣列排序後,第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元素在右邊序列,遞迴右...