Chris_kxt 2018-03-28 07:49 采纳率: 100%
浏览 1071
已采纳

C++语言编程 急急!!!用分治策略

设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。

提示:函数int partition(int a[],int left,int right)的功能是根据a[left]~a[right]中的某个元素x(如a[left])对a[left]~a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。因此可以编制int find(int a[],int left,int right,int k)函数,通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。

输入格式:
输入有两行:

第一行是n和k,0<k<=n<=10000

第二行是n个整数

输出格式:
输出第k小的数

输入样例:
在这里给出一组输入。例如:

10 4
2 8 9 0 1 3 6 7 8 2
输出样例:
在这里给出相应的输出。例如:

2

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-03-28 07:59
    关注
     参考下面的程序,输入输出就你自己修改了,不然等于帮你做作业了。
    
    #include<iostream>  
    #include<stdio.h>  
    using namespace std;  
    
    int Partition (int *L, int low, int high)  
    {  
        int temp = L[low];  
        int pt   = L[low]; //哨兵  
        while (low != high)  
        {  
            while (low < high && L[high] >= pt)  
                high--;  
            L[low] = L[high];         
    
            while (low < high && L[low] <= pt)  
                low++;  
            L[high] = L[low];  
        }     
        L[low] = temp;  
        return low;  
    }  
    
    void QSort (int *L, int low, int high)  //快速排序  
    {  
        int pl;  
        if (low < high)  
        {  
            pl = Partition (L,low,high);  
            QSort (L, low,  pl-1);  
            QSort (L, pl+1, high);  
        }  
    }  
    
    void findk(int k,int *L,int low,int high)  
    {  
        int temp;  
        temp=Partition(L,low,high);  
        if(temp==k-1)  
        {  
            cout<<"第"<<temp+1<<"大的数是:"<<L[temp]<<endl;  
        }  
        else if(temp>k-1)  
            findk(k,L,low,temp-1);  
        else  
            findk(k,L,temp+1,high);  
    }  
    
    int main()  
    {  
        int a[10]={15,25,9,48,36,100,58,99,126,5},i,j,k;  
        cout<<"排序前:"<<endl;  
        for(i=0;i<10;i++){  
            cout<<a[i]<<" ";  
        }  
        cout<<endl;  
        cout<<"请输入你要查找第k大的数:"<<endl;  
        cin>>k;  
        findk(k,a,0,9); //查找第k大的数不需要全部排序  
    
        QSort(a,0,9);     
        cout<<"排序后:"<<endl;  
        for(i=0;i<10;i++){  
            cout<<a[i]<<" ";  
        }  
        cout<<endl;  
        system("Pause");  
        return 0;  
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格