寻找一个序列中第k小的元素——分治法
寻找一个序列中第k小的元素——分治法
#include
/*
分治策略
假设无序序列存放在a[0...n-1]中,若将a递增排序,则第k小的元素为a[k-1]。采用类似快速排序的思想
对于无序序列a[s...t],在其中查找第k小的元素的过程
1.若s>=t,即其中只有一个元素或没有任何元素,如果s=t且s=k-1,表示只有一个元素且a[k-1]就是要求的
结果,返回a[k-1]
2.若s
子序列,基准a[i]已归位,a[s...i-1]中的所有元素均小于a[i],a[i+1...t]中的所有元素均大于a[i],
也就是说a[i]是第i+1小的元素,有3个情况
(1)若k-1=i,a[i]即为所求,返回a[i]
(2)若k-1
(3)若k-1>i,第k小的元素应在a[i+1...t]子序列中,递归在该子序列中求解并返回其结果
*/
int QuickSelect(int a[], int s, int t, int k);//在a[s...t]中找第k小的元素
int main()
{
int n = 10, k;
int e;
int a[] = {2, 5, 1, 7, 10, 6, 9, 4, 3, 8};
for(k = 1; k <= n; k++)
{ </