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小元素的演算法會產生大量的冗餘,這時候利用每組的中位數並不合算,找中位數代價極大,然而效益...