usingview codesystem;
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;}}
}
參考:尋找陣列中的第二大數
求乙個陣列中第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大數**如下:
usingview codesystem;
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}}
}
尋找第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 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...