程序填空题:查找第K小元素(分治法)
查找第K小元素(分治法)。
```c++
#include
#define N 1000
using namespace std;
int Kminselect(int a[],int s,int t,int k)
{ int i=s,j=t,tmp;
if (@@[s { tmp=a[s];
while (i!=j) //从区间两端交替向中间扫描,直至i=j为止
{ while (j>i && a[j]>=tmp) j--;
a[i]=a[j]; //将a[j]前移到a[i]的位置
while (i a[j]=a[i]; //将a[i]后移到a[j]的位置
}
a[i]=tmp;
if (k-1==i) return @@[a[i]](2);
else if (k-1 //在左区间中递归查找
else return @@[Kminselect(a,i+1,t,k)](2);
//在右区间中递归查找
}
else if (s==t && s==k-1) //区间内只有一个元素且为a[k-1]
return a[k-1];
}
int main()
{
int A[N],i,k,n;
cin>>n;
for(i=0;i cin>>A[i];
cin>>k;
cout< return 0;
}
```
### 输入样例:
第一行输入一个数n,第二行输入n个数,第三行输入一个数表示第K小元素
```in
12
19 14 23 1 68 20 84 27 55 11 10 79
5
```
### 输出样例:
输出序列中第K小元素的值。
```out
19
```
答案:
第1空:s
第2空:a[i]
第3空:Kminselect(a,s,i-1,k)
第4空:Kminselect(a,i+1,t,k)
```c++
#include
#define N 1000
using namespace std;
int Kminselect(int a[],int s,int t,int k)
{ int i=s,j=t,tmp;
if (@@[s
while (i!=j) //从区间两端交替向中间扫描,直至i=j为止
{ while (j>i && a[j]>=tmp) j--;
a[i]=a[j]; //将a[j]前移到a[i]的位置
while (i
}
a[i]=tmp;
if (k-1==i) return @@[a[i]](2);
else if (k-1 //在左区间中递归查找
else return @@[Kminselect(a,i+1,t,k)](2);
//在右区间中递归查找
}
else if (s==t && s==k-1) //区间内只有一个元素且为a[k-1]
return a[k-1];
}
int main()
{
int A[N],i,k,n;
cin>>n;
for(i=0;i
cin>>k;
cout<
}
```
### 输入样例:
第一行输入一个数n,第二行输入n个数,第三行输入一个数表示第K小元素
```in
12
19 14 23 1 68 20 84 27 55 11 10 79
5
```
### 输出样例:
输出序列中第K小元素的值。
```out
19
```
答案:
第1空:s
第2空:a[i]
第3空:Kminselect(a,s,i-1,k)
第4空:Kminselect(a,i+1,t,k)