尋找陣列中第K大數

2022-02-22 22:25:06 字數 2607 閱讀 4076

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

;

try

catch

(exception exc)

console.readkey();

}private

static

int get2rdmax(int

ar)}

}if (max == s_max) //

至少有兩個一樣的最大值

throw

new exception("

no second max!");

else

return

s_max;}}

}

view code

參考:尋找陣列中的第二大數

求乙個陣列中第k大的數,我第一印象是冒泡,因為只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,時間複雜度為o(kn),n為陣列長度。

但是我們都知道快速排序是對冒泡的改進,降低冒泡的遞迴深度,使時間複雜度降低到o(nlgn),為什麼不用快排呢?那麼快排的時間複雜度又是多少呢?

因為快排每次將陣列劃分為兩組加乙個樞紐元素,每一趟劃分你只需要將k與樞紐元素的下標進行比較,如果比樞紐元素下標大就從右邊的子陣列中找,如果比樞紐元素下標小從左邊的子陣列中找,如果一樣則就是樞紐元素,找到,如果需要從左邊或者右邊的子陣列中再查詢的話,只需要遞迴一邊查詢即可,無需像快排一樣兩邊都需要遞迴,所以複雜度必然降低。

最差情況如下:假設快排每次都平均劃分,但是都不在樞紐元素上找到第k大

第一趟快排沒找到,時間複雜度為o(n),第二趟也沒找到,時間複雜度為o(n/2),。。。。。,第k趟找到,時間複雜度為o(n/2k),所以總的時間複雜度為

o(n(1+1/2+....+1/2k))=o(n),明顯比冒泡快,雖然遞迴深度是一樣的,但是每一趟時間複雜度降低。

快排求第k大數**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

求陣列第k大的數

;

//此方法實現的就是快速排序。。

"陣列中第12大的數是:"+ar[12-1]);

);int ar = ;

console.writeline(

"表中有元素

" + ar.length + "

個,下標是0—

" + (ar.length - 1

));

for (int i = 0; i < ar.length; i++)

quicksort(ar,

0, ar.length - 1); //

快速排序

console.writeline();

for (int i = ar.length - 1; i >= 0; i--) //

從大到小排

console.writeline(

"輸入你想找的第k大數(正整數):");

string k =console.readline();

int k =convert.toint32(k);

console.writeline(ar[ar.length -k]);

console.readline();

}public

static

void quicksort(int a, int low, int

high)

a[low] = a[high]; //

將 比tmp小的放在前面,low位置

while ((low < high) && (a[low] <= tmp)) //

前面 比tmp小的 不動

a[high] = a[low]; //

將 比tmp大的放在後面,high位置

//直到此時 low=high

} a[high] = a[low] = tmp; //

此時low=high ,就完成了以tmp值來分界

//分別對前後兩部分來 快速排序

if (i < low - 1) //

對tmp 前面的數(0到low-1) 遞迴呼叫,,此時【low】==tmp,low=high

if (low + 1

< j) //

對tmp 後面的數(low+1到j) 遞迴呼叫,,此時【low】==tmp,low=high}}

}

view code

尋找第k大數字

sicily description 經過長時間的籌備工作,在jourk,ronny,plipala,阿長,阿沈等人的努力下,dm實驗室建立起自己的系列 其中包括三個大板塊 dmoj首頁 dmoj論壇 dmoj部落格。作為乙個大型的 資料的加工處理需要用到很多演算法系統模組,通過這些模組對系統主資料...

陣列中求第K大數

問題 有乙個大小為n的陣列a 0,1,2,n 1 求其中第k大的數。該問題是乙個經典的問題,在 演算法導論 中被作為單獨的一節提出,而且其解決方法很好的利用了分治的思想,將時間複雜度控制在了o n 這多少出乎我們的意料,此處暫且不表。該問題還可以變形為 有乙個大小為 n的陣列a 0,1,2,n 1 ...

分治演算法 尋找第k大數

問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...