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

2021-06-14 06:32:44 字數 1912 閱讀 5375

1.問題描述

對於乙個非有序的陣列a[start..end],求陣列中第k小的元素

2.解決思路

最直觀的的方式,先對陣列排序,複雜度為o(nlgn),但是這樣複雜度太大,可以利用快速排序的思路,解決這個問題,並且複雜度為o(n)。

關鍵在於劃分只乙個部分,我們知道快速排序選擇乙個pivot對陣列進行劃分,左邊小於pivot,右邊大於等於pivot,所以我們計算左邊小於pivot(加上pivot)的個數count總共有多少,如果等於k,正是我們所要的,如果大於k,說明第k小的數在左邊,那就在左邊進行我們的遞迴;否則,在右邊,那麼說明右邊的第k-count小的數就是我們所要的,在右邊進行

我們的遞迴。

/* file: rand_select							*/

/* 1、the same as the quicksort */

/* 2、use a random algorithm to choose a pivot,

then split the array into two subarrays.

the left elements are smaller than pivot,

the right elements are larger than pivot */

/* 3、compare i with pivot'index to choose the

correct side of the array. */

/* 4、conquer to find the ith smallest element */

#include#include /************************************==

swap:swap two numbers a and b

***********************************====*/

inline void swap(int* a,int* b)

/************************************==

partition:partition the array from start

to end into two subarrays.

return the pivot of the element

array[start]

***********************************====*/

int partition(int* array, int start, int end)

swap(&array[start], &array[pivot]);

return pivot;

}/************************************==

randompartition:using random algorithm.partition the

array into two subarrays.return the

pivot of the element array[start] which

is already swaped

***********************************====*/

int randompartition(int* array, int start, int end)

/************************************==

randselect:find the ith smallest element

***********************************====*/

int randselect(int* array, int start, int end, int i)

void main()

}

分治演算法求第k小元素

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

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

在 陣列s中查詢第k小的元素並輸出 分治演算法 將s分為多個組q,每組5個元素,有剩餘的話,則排序剩餘元素。將q個組單獨排序,每組找出中項,中項組成集合m,以m中項n作為標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比n小的都放入s1的陣列中,陣列s1的元素個數是 s1 個 把這個陣列中比n大的...

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

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