分治演算法求陣列第k小元素

2021-10-06 10:34:32 字數 1736 閱讀 7331

在 陣列s中查詢第k小的元素並輸出(分治演算法)

將s分為多個組q,每組5個元素,有剩餘的話,則排序剩餘元素。 將q個組單獨排序,每組找出中項,中項組成集合m,以m中項n作為標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比n小的都放入s1的陣列中,陣列s1的元素個數是|s1|個;把這個陣列中比n大的都放入s2的陣列中,陣列s2的元素個數是|s2|個。

當要找的k<|s1|,就s1中找第k小的子問題。

當要找的k=|s1|+1, n=k。

當要找的k>|s1|+1,就在陣列s2中找第k小的子問題。

int select(int *in,int l,int h, int s)

for (int i = 0; i < n; i++)

int t1 = 0,t2 = 0,t3 = 0;

int mid = select(mo, 0, n, (n - 1) / 2), * a = (int*)malloc(sizeof(int) * m);

int * b = (int*)malloc(sizeof(int) * m);

int * c = (int*)malloc(sizeof(int) * m);

for (int i = l; i <= h; i++)

if(t1 + t2 >= s)

return mid;

else if (t1 > s)

return select(a, 0, t1 - 1, s);

else

return select(c, 0, t3 - 1, s - t1 - t2);最壞情況:

t(n)=o(n^2 )

一般情況:

t(n)=t(n/2)+n-1

t(n)=o(n)

#include

#include

#include

#define max 44

int sort( int *in,int l, int h);

int select(int *in,int l,int h, int s);

int main()

int k ;

scanf("%d",&k);

printf("第k小素是:%d\n",select(in, 0, n - 1, k-1));

return 0;int sort( int *in,int l, int h)

}

}

}

int select(int *in,int l,int h, int s)

for (int i = 0; i < n; i++)

int t1 = 0,t2 = 0,t3 = 0;

int mid = select(mo, 0, n, (n - 1) / 2), * a = (int*)malloc(sizeof(int) * m);

int * b = (int*)malloc(sizeof(int) * m);

int * c = (int*)malloc(sizeof(int) * m);

for (int i = l; i <= h; i++)

if(t1 + t2 >= s)

return mid;

else if (t1 > s)

return select(a, 0, t1 - 1, s);

else

return select(c, 0, t3 - 1, s - t1 - t2);

分治演算法求第k小元素

1.問題 用分治的演算法求乙個陣列s n 中第k小的元素。2.解析 採取和快速演算法相同的思路,但是結合分治的思想,選取恰當的基準值。找到基準值以後,再按照快速排序的方法進行查詢就好了。3.設計 int r 5int r group ceil high low 1 1.0 r ceil取上限,總共分...

分治演算法四(查詢第K小元素)

1.問題描述 對於乙個非有序的陣列a start.end 求陣列中第k小的元素 2.解決思路 最直觀的的方式,先對陣列排序,複雜度為o nlgn 但是這樣複雜度太大,可以利用快速排序的思路,解決這個問題,並且複雜度為o n 關鍵在於劃分只乙個部分,我們知道快速排序選擇乙個pivot對陣列進行劃分,左...

分治法尋找第k小元素演算法的優化

分治法尋找第k小元素演算法的優化 目的和意義 利用分治演算法尋找第k小元素並不是適用於所有情況,在處理一些問題時,按照傳統的分治的演算法似乎並不合理,舉個例子,在尋找一萬個元素中的第十小元素時利用傳統的尋找第k小元素的演算法會產生大量的冗餘,這時候利用每組的中位數並不合算,找中位數代價極大,然而效益...