`
ifox
  • 浏览: 65362 次
社区版块
存档分类
最新评论

一亿取100数字Top100

 
阅读更多

觉得蛮有参考意义的,所以就贴上来了,方便以后自己看。
package com.my.util;

import java.util.Arrays;
import java.util.Date;
import java.util.Random;

public class Top100 {
	
	public static void main(String[] args) {
		find();
	}
	public static void find( ) {//
		int number = 100000000;// 一亿个数
		int maxnum = 1000000000;// 随机数最大值
		int i = 0;
		int topnum = 100;// 取最大的多少个
	 
		Date startTime = new Date();
		
		Random random = new Random();
		int[] top = new int[topnum];
		for (i = 0; i < topnum; i++) {
			top[i] = Math.abs(random.nextInt(maxnum));//设置为随机数
//			top[i] = getNum(i);
		}

		buildHeap(top, 0, top.length);// 构建最小堆, top[0]为最小元素
		for (i = topnum; i < number; i++) {

			int currentNumber2 = Math.abs(random.nextInt(maxnum));//设置为随机数
//			int currentNumber2 = getNum(i);
			// 大于 top[0]则交换currentNumber2  重构最小堆
			if (top[0] < currentNumber2) {
				top[0] = currentNumber2;
				shift(top, 0, top.length, 0); // 构建最小堆 top[0]为最小元素
			}
		}
		System.out.println(Arrays.toString(top));
		sort(top);
		System.out.println(Arrays.toString(top));
		
		Date endTime = new Date();
		System.out.println("用了"+(endTime.getTime() - startTime.getTime())+"毫秒");
 
	}
	
	public static int getNum(int i){
		return i;
	}

 
	//构造排序数组
	public static void buildHeap(int[] array, int from, int len) {
		int pos = (len - 1) / 2;
		for (int i = pos; i >= 0; i--) {
			shift(array, from, len, i);
		}
	}
 
	/**
	 * @param array top数组
	 * @param from 开始
	 * @param len 数组长度
	 * @param pos 当前节点index
	 * */
	public static void shift(int[] array, int from, int len, int pos) {
		// 保存该节点的值 
		int tmp = array[from + pos];

		int index = pos * 2 + 1;// 得到当前pos节点的左节点
		while (index < len)//  存在左节点
		{
			if (index + 1 < len
					&& array[from + index] > array[from + index + 1])// 如果存在右节点
			{
				// 如果右边节点比左边节点小,就和右边的比较
				index += 1;
			}
			 
			if (tmp > array[from + index]) {
				array[from + pos] = array[from + index];
				pos = index;
				index = pos * 2 + 1;
			} else {
				break;
			}
		}
		// 最终全部置换完毕后 ,把临时变量赋给最后的节点
		array[from + pos] = tmp;
	}
	
	public static void sort(int[] array){  
        for(int i = 0; i < array.length - 1; i++){  
            //当前值当作最小值  
            int min = array[i];  
            for(int j = i+1; j < array.length; j++){  
                if(min>array[j]){  
                    //如果后面有比min值还小的就交换  
                    min = array[j];  
                    array[j] = array[i];  
                    array[i] = min;  
                }  
            }  
        }  
    }

}
 
分享到:
评论

相关推荐

    java一亿数字取前100个(3秒钟获取)

    在这个场景中,我们需要从一亿个数字中快速找出前100个最小的数字。这通常涉及到排序算法和数据结构的运用,以达到在短时间内找到目标结果。以下是实现这个任务的一些关键知识点: 1. **优先队列(Priority Queue)...

    2020年中国便利店Top100精品报告2020.pdf

    根据所提供的《2020年中国便利店Top100精品报告》内容,我们可以得知中国便利店市场的发展情况,其中提及到的公司和品牌大多是行业内的佼佼者,门店数量多,市场占有率高。 品牌排名: 报告中列举了中国便利店行业...

    oracle select top的方法

    - **定义**: `ROW_NUMBER()` 是一个窗口函数,用于给每一行分配一个唯一的数字。 - **使用场景**: 当需要对查询结果进行排序并获取特定数量的行时非常有用。 - **语法**: `ROW_NUMBER() OVER (ORDER BY &lt;排序列&gt; ...

    关于数字电位器带宽应用

    为了简化分析,可以将数字电位器R2分为两部分:R2top和R2bottom,如**图2**所示。通过这种方式,我们可以更容易地计算出电路的传输函数VOUT/VIN,该函数在不同的电位器编码下有不同的表现,如**图3**所示。 ##### ...

    创建一个递增数字框...

    通过上述方法,我们可以利用VB中垂直滚动条的逆向使用,结合取绝对值函数,成功地创建了一个递增数字框,实现了特定场景下的数值输入控制需求。这种方法不仅展示了编程的灵活性,也提供了在面对非标准需求时的解决...

    python topN 取最大的N个数或最小的N个数方法

    例如,给定一个数组a = [1, 4, 3, 5, 2],通过调用np.argsort(a),我们可以得到一个数组b = [0, 4, 2, 1, 3],这个数组b中的每个数字代表着原数组a中的元素在排序后的位置。因此,a[0]就是最小的元素,a[3]是最小的...

    SQL中Group分组获取Top N方法实现可首选row_number

    Row_Number函数是SQL Server中用于为结果集中的每一行分配一个唯一的数字,可以通过PARTITION BY子句按特定分组进行重置计数。在上述例子中,我们先为每个城市的每个产品按添加时间降序分配行号,然后筛选出行号...

    VHDL多功能数字钟

    VHDL(VHSIC Hardware Description Language)是一种用于硬件描述的语言,它被广泛应用于数字电子系统的设计,包括FPGA(Field-Programmable Gate Array)和ASIC(Application-Specific Integrated Circuit)等。...

    基于TOP100Y的双路输出开关电源设计.rar-综合文档

    在这个主题中,我们将深入探讨一种采用TOP100Y芯片的双路输出开关电源设计。TOP100Y是一款集成度高的开关电源控制器,适用于多种电源应用,尤其是对于需要双路独立输出的场合。 首先,我们来看一下TOP100Y的主要...

    top.rar_music_vhdl

    标题中的"top.rar_music_vhdl"表明这是一个与音乐和VHDL(Very High-Speed Integrated Circuit Hardware Description Language)相关的压缩文件。VHDL是一种用于电子设计自动化领域的硬件描述语言,它允许工程师用一...

    企业数字化转型如何影响企业 ESG 表现来自中国上市公司的证据数据2010-2020+程序代码

    数据来源 基于上市公司数据整理计算 时间跨度 2010-2020年 数据范围 中国沪深 A 股上市公司 数据指标 类型 变量 符号 变量定义 ...华证ESG季度评级赋值1-9分,取平均 ...数字化转型程度 ...第一大

    数据结构和算法面试最新100题

    1. **初始化计数器:** 构建一个计数器数组`count`,用来统计数组中各个数字出现的次数。 2. **重新排列:** 根据`count`数组中的值,将数字按照要求重新排列。 **代码示例:** ```cpp std::vector&lt;int&gt; specialSort...

    全球创业者城市TOP50报告.docx

    因此,一个城市能否成为创业者的首选之地,很大程度上取决于它是否能提供一个适宜的创业环境。 接下来,报告通过2019年的数据,列出全球创业者城市TOP50的榜单。这个排名基于一个重要指标——融资规模超过1000万...

    402. 移掉K位数字 golang

    在编程领域,问题402“移掉K位数字”是一个经典的字符串处理问题,主要涉及字符串操作、栈数据结构的应用以及条件判断。这个问题的目标是从一个给定的整数字符串`num`中移除`k`个最小的数字,使得剩下的数字序列尽...

    竞赛:竞赛项目集合:罗斯曼销售预测(Top3%),房价(Top34%),数字识别(Top78%),泰坦尼克(Top83%),能源预测③(Top36%),未来价格预测(Top37%), NFL大数据碗(Top61%),厄瓜多尔连锁超市销售预测(Top48%),StoreItemPredict(Top34%),餐厅顾客预测(Top37%),谷歌流量预测(Topxxx)

    Rossmann销售预测(Top3%):Rossmann在7个欧洲国家经营着3000药店。结果,罗斯曼门店经理的任务是提前6周预测他们的日收益,商店的销售受到许多因素的影响,包括促销,竞争,学校和国家假日,重置和地域性,由于...

    sqlserver巧用row_number和partition by分组取top数据

    通过这种方式,我们无需使用复杂的子查询、临时表或自连接,就能轻松地实现分组取TOP数据的操作。这极大地提高了查询效率,简化了SQL语句,也使得处理大数据集变得更加高效和便捷。 总之,`row_number()` 和 `...

    行业文档-设计装置-数字电视机顶盒存储器电路.zip

    在现代数字电视机顶盒(Digital Set-Top Box, STB)中,存储器电路扮演着至关重要的角色,它是系统运行、解码高清视频、处理用户交互以及提供多元化服务的基础。这份文档详细阐述了以下几个关键知识点: 1. 存储器...

Global site tag (gtag.js) - Google Analytics