非遞迴且最壞情況下仍然為O n 的第K大數程式

2021-06-27 18:06:09 字數 1285 閱讀 9466

利用上述此題來進行驗證,**如下:

#include#include#include#include#include#includeusing namespace std;

const int block_size = 5;

int findkth(vector&,int,int,int);

int insert_sort(vector&arr, int start, int end)

vectorpush_medians(vector&arr, int start, int end)

if(extra)

return medians;

}int find_median(vector&arr,int start,int end)

int findkth(vector&arr,int start,int end,int k)

stack> stk;

stk.push(make_pair(start,end));

while(!stk.empty())else

}int small = start - 1;

for(int i = start; i < end; i++)}}

}int main(int argc, char* argv)

cout<

摘自:總體意思就是:

每次進行median of median操作的時候都可以保證可以最少去掉30%的資料,

結論得來的不等式如下:

不等式的含義是對於長度為n的陣列,那麼其至少得有n/5個子陣列(每個陣列的長度理論上均為5),然後你考慮比median of median大的數的數量的最小值

顯然至少要有1/2 * (n/5)個子陣列有比median of median大的數,其中每個子陣列裡頭比median of median大的數至少得有三個,除了兩個子陣列以外,

這兩個子陣列分別為median of median所在的子陣列本身以及長度不及5的子陣列,因此就得到了上述不等式。

同理可以推出median of median小的數的數量的最小值,

因此我們可以推出以下不等式,第一項是計算median of median的時間複雜度,第二項為計算剩餘數字的時間複雜度,第三項是當前輪的時間複雜度

最壞情況下保證時間複雜度為N logN的快速排序

快速排序的平均時間複雜度是n logn,同時其也是實踐已知的最快的通用排序演算法,但是其最壞情況的時間複雜度依然是n的平方,但是只要我們對快速排序演算法稍作修改,就可以保證其最壞情況的時間複雜度也是n logn。思路就是在遞迴達到一定深度後,將快速排序的遞迴呼叫改為堆排序,下面是我實現的 我將遞迴深...

非root情況下安裝mysql

由於沒有root許可權,不想使用root使用者安裝在系統中的mysql,今天打算在伺服器自己的個人目錄裡安裝mysql。找到了乙個非root使用者安裝的方法,按步驟做下來還是踩了不少坑,由此記錄一下。參考 linux下非root許可權安裝mysql tar zvxf tar.gz 解壓縮 cd 進入...

什麼情況下用遞迴?

遞迴的特點,可以看出遞迴可以大大縮短程式的 有意識的使用遞迴,可以用較短的 解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?遞迴演算法的 基本思想 是 把規模大的 較難解決的問題變成規模較小的 易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度...