走过路过的大神,捎带看一眼选择算法的代码。acm报错runtime error。
在分治算法的分支里还有一个是选择算法。它是一种能够以O(n)时间选取数组的中值元素或任意的第K小元素的算法。基本思路是:在分治算法的递归调用的每一个划分步骤里,放弃一个固定部分的元素,对其余元素进行递归。于是,问题的规模便以几何级数递减如果第一次递归放弃处理1/3的元素,那么第二次递归时,只要处理原来的2/3的元素,在第三次递归时,只要处理原来的4/9的元素,如此等等。请根据此算法,解决以下问题。按递增顺序,以比较快的速度查找出N(N<=10000)个元素的第K小的元素。
代码如下:
#include<iostream>
using namespace std;
int nlist[10000];
int part(int l,int r){
int temp = nlist[l];
int i = l, j = r;
while (i < j)
{
while ( i < j && nlist[j] >= temp )
{
j--;
}
nlist[i] = nlist[j];
while ( i < j && nlist[i] <= temp)
{
i++;
}
nlist[j] = nlist[i];
}
nlist[i] = temp;
return i;
}
int selctsort(int key,int mid,int n)
{
if (key == nlist[mid])
{
return mid+1;
}
else if (key < nlist[mid])
{
selctsort(key,part(0,mid-1),n);
}
else{
selctsort(key,part(mid+1,n-1),n);
}
}
int main(){
int n,k;
int i;
cin >> n >> k;
for (i = 0; i < n;i ++)
{
cin >> nlist[i];
}
cout << selctsort(k,part(0,n-1),n-1) << endl;
return 0;
}