[置顶] 大数(一亿个数)中求前一百个最大的数输出问题
#include <iostream> using namespace std; #include<ctime> /* 一亿个数里面求前一百个最大的数输出问题 算法思想: 1、将前一百个数建成小根堆 2、后面数字依此与肯比较大小 (1)如果比根大进行下一个 (2)如果比根小,将其与根替换并调整堆重新为小根堆 */ void BuildMinHeap(int A[],int len); void AdjustDown(int A[],int k,int len); int main() { //因为A为堆所以A[0]不用 int A[101];int count=100; while(count--)//前一百个数默认为最大数 { A[count+1]= rand()%1000+1; cout<<A[count+1]<<endl; } BuildMinHeap(A,100); int temp=0; time_t start,end,time;//获取程序运行时间 start = clock(); for(int i=101;i<100000000;i++) { temp = rand()%10000; if(temp < A[1])//如果下一个数小于小顶堆堆顶元素 { A[1] = temp; //替换 BuildMinHeap(A,100);//调整堆 } } end = clock(); time = end-start;//单位毫秒 cout<<"运行时间为"<<time<<endl; system("pause"); } //调整为小根堆 void BuildMinHeap(int A[],int len) { for(int i=len/2;i>0;i--) { AdjustDown(A,i,len); } } void AdjustDown(int A[],int k,int len) { //将第K个元素向下调整 A[0] = A[k];//暂存需要调整的元素 for(int i = 2*k;i<= len ; i*=2) { if(i<len && A[i]>A[i+1]) //取其较小的子孙节点 i++; if(A[0]<=A[i]) break; //如果该节点比子孙节点要小,则不需替换 else{//否则 A[k]= A[i]; //将A[i]调整到双亲节点上 k=i; //k位置为替换的元素,下次循环考虑是否要向下调整 } } A[k] = A[0]; //被筛选节点放入最终位置 }
------------------------VS2010 格式调整 Ctrl k ,Ctrl f------------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决