O(n)时间找前K大的元素

写代码的时候需要一个 找出数组前五大元素 结构,之前学堆的之后还记得有最小堆 求前五大元素的方法,于是就让 Kimi,通义千问给我写一个,给的太复杂了,不适合嵌入代码 ,故自己写了个逻辑简单的:

 ​​​​

该代码首先创建一个 大小为HeapMax 整型数组 Sub,Sub意为存储的是比较元素的下标

//    int HeapMax= RandInt(2,n_service/10)+1;
//    vector<int>  Sub;//创建最小堆
//    Sub.resize(HeapMax);
// //然后填充比较大小的数据对应的数组下标
//    for (int i = 0; i < HeapMax; ++i) {
//        Sub[i]=i; //填充堆
//    }
//  //然后用一个变量 min,保存当前数组中最小的元素的下标所存储在该HeapMax的位置,大白话就是 记  录 最小堆中的堆首元素的位置,这里只需要记录堆首元素;
//    //找最小堆堆首元素
//    int min=0;
//    for (int j = 1; j  < HeapMax; ++j) {
//        if (Arr[Sub[j]] < Arr[Sub[min]])
//            min=j;
//    }
// //满了之后进入for循环,遍历其他,对比该元素和当前数组中 min下标的数组的数据 哪个更大,如果新扫描到的更大,则将新扫描的 数据的数组下标 替换掉  min所指位置所存储的Arr的下标.
//    for (int i = HeapMax; i < Arr.Size; ++i) {
//        if (Arr[i] > Arr[Sub[min]]) {     
//            Sub[min]=i;//现在位置存新进入的,将新加入的放入之前min所在位置;
//            
               //重新找最小堆堆首元素
//            min=0;
//            for (int j = 1; j <HeapMax; ++j) {
//                if (nArr[Sub[j]]<Arr[Sub[min]])
//                    min=j;
//            }
//        } 
//    }

完整代码:

    int HeapMax= RandInt(2,n_service/10)+1;
    vector<int>  Sub;//创建最小堆
    Sub.resize(HeapMax);
    for (int i = 0; i < HeapMax; ++i) {
        Sub[i]=i; //填充堆
    }

   //找最小堆堆首元素
   int min=0;
    for (int j = 1; j  < HeapMax; ++j) {
        if (Arr[Sub[j]] < Arr[Sub[min]])
            min=j;
    }

    for (int i = HeapMax; i < Arr.Size; ++i) {
        if (Arr[i] > Arr[Sub[min]]) {     
            Sub[min]=i;
            min=0;
            for (int j = 1; j <HeapMax; ++j) {
               if (nArr[Sub[j]]<Arr[Sub[min]])
                    min=j;
            }
        } 
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值