zoukankan      html  css  js  c++  java
  • [置顶] 大数(一亿个数)中求前一百个最大的数输出问题

    #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------------------------

  • 相关阅读:
    1491: [NOI2007]社交网络
    Ombrophobic Bovines
    1566: [NOI2009]管道取珠
    1564: [NOI2009]二叉查找树
    1497: [NOI2006]最大获利
    mysql数据库修改字段及新增字段脚本
    NIO
    Lombok用法及标签释义
    idea2017.2延长使用时间
    IDEA 注册码
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3509151.html
Copyright © 2011-2022 走看看