问题 2540 --找数问题

2540: 找数问题★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 48  解决: 23
[提交][状态][命题人:]

题目描述

以下程序用在n个不同元素中找出第k个最小元素。程序中用分治策略来设计算法。把这n个元素放在一个数组中,然后取出第k个元素为标注X,把n个元素重新排列:小于标准X的元素放在数组前面,大于该标准X的放在数组的后面。把该元素X放在两者之间。设小于标准的元素个数为i-1,如果i==k,则A[k]即为所求元素。如果i>k,则第k个元素必在区间[1, i-1],因此取A[1],…,A[i-1]为新的元素集合,然后重复上述的“部分排序”的过程。如果i<k,则第k个元素必在区间[i+1,n],因此取A[i+1],…, A[n]为新的元素集合,重复过程。直至i == k为止。

#include<iostream>
using namespace std;
int a[110];
int n, k;
void search(int ll, int rr)
{
    if(ll == rr) return;
    int i = ll, j = rr, X =_______(1)_________;
    do
{
        while(a[i] < X)  i++;
        while(X < a[j])  ______(2)__________;
        if(i < j)
{
            int t = a[i]; a[i] = a[j]; a[j] = t;
        }
    }while(i < j);
   
    if(i == k) return;
    if(i > k) search(ll, i-1);
    else _______(3)__________;
}
void pr(int n)
{
    for(int i = 1; i <= n; i++) cout << a[i] <<' ';
    cout << endl;
    cout << "a["<< k <<"]=" <<______(4)___________<< endl;
}
int main( )
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    cin >> k;
    search(______(5)_________);
    pr(n);
    return 0;

输入

输出

样例输入
Copy
10
3 2  5 8 4 9 1 6 10 7
4
样例输出
Copy
1 2 3 4 5 6 7 8 10 9 
a[4]=4

提示

来源

 

[提交][状态]