写代码的时候需要一个 找出数组前五大元素 结构,之前学堆的之后还记得有最小堆 求前五大元素的方法,于是就让 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;
}
}
}