获取一亿数据获取前100个最大值

package cn.usst.tophundred.quicksort;

import java.util.Random;
/**
获取一亿数据获取前100个最大值
1. 假设数组为 array[N] (N = 1 亿),首先利用quicksort的原理把array分成两个部分,左边部分比 array[N - 1] (array中的最后一个值,即pivot) 大, 右边部分比pivot 小。然后,可以得到 array[array.length - 1] (即 pivot) 在整个数组中的位置,假设是 k.
2. 如果 k 比 99 大,我们在数组[0, k - 1]里找前 100 最大值。 (继续递归)
3. 如果 k 比 99 小, 我们在数组[k + 1, ..., N ]里找前 100 - (k + 1) 最大值。(继续递归)
4. 如果 k == 99, 那么数组的前 100 个值一定是最大的。(退出)
*/

public class TopHundredQuickSort {

	public static void main(String[] args) {
		// the size of the array
		int number = 100000000;
		// the top k values
		int k = 100;
		// the range of the values in the array
		int range = 1000000001;

		// input for minHeap based method
		int[] array = new int[number];

		Random random = new Random();
		for(int i=0; i<number; i++){
			array[i] = random.nextInt(range);
		}

		TopHundredQuickSort topHundred = new TopHundredQuickSort();

		// start time
		long t1 = System.currentTimeMillis();
		topHundred.tophundred(array, 0, array.length-1, k);

		// end time
		long t2 = System.currentTimeMillis();

		System.out.println("The total execution time of quicksort based method is" + (t2-t1) + " millisecond");

		// print out the top k largest values in the top array
		System.out.println("The top " + k + " largest values are:");
		for(int i=0; i<k; i++){
			System.out.println(array[i]);
		}
	}

	private void tophundred(int[] array, int start, int end, int k) {
		int switchPointer = start;
		// array最后一个值作为pivot
		int pivot = array[end];
		for(int i=start; i<end; i++){
			if(array[i] >= pivot){
				swap(array, switchPointer, i);
				switchPointer++;
			}
		}

		// 交换后 array左边的值比pivot大   右边的值比pivot小
		swap(array, end, switchPointer);

		if(switchPointer < k-1){
			tophundred(array, switchPointer+1, end, k);
		}else if(switchPointer == k-1){
			return;
		}else{
			tophundred(array, 0, switchPointer-1, k);
		}

	}

	private void swap(int[] array, int i, int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}

}

时间: 2024-12-21 23:02:02

获取一亿数据获取前100个最大值的相关文章

1亿个数选前100最大数

算法思想 1.选择一亿数的前100数前100个数排序 2.后面的数字通过插入排序 #include<iostream> using namespace std; void buddlesort(int array[],int n) { bool exchange=true; int count=n; while(exchange){ exchange=false; for(int i=0;i<count;i++) { if(array[i]>array[i+1]) { int te

面试题之十亿条记录,怎么获取出现最多的前十个

宅在家中无事,刷面试题,发现了一个很有意思的面试题. 就来琢磨一下这个是如何能够处理成功.(这是一个长更新视频,说不定中间就干其他的去了,慢慢更ing) StratTime : 202002191600 首先我们来造一下数据.虽然不知道淘宝的购物记录,但是我们来算成ip浏览记录吧.那么我们来获取10亿条ip 代码如下 public class createIp { public static String getRandomIp() { // ip范围 int[][] range = { { 6

linux分析apache日志获取最多访问的前10个IP

apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数. 既然是统计,那么awk是必不可少的,好用而高效. 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail 首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个. 以上参数可以略作修改显示更多的数据,比如将tail加上-

【转】GitHub 排名前 100 的安卓、iOS项目简介

GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这 个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 Re

只显示 前100个字 java 实现截取字符串!使用! &lt;c:if test=&quot;${fn:length(onebeans.info)&gt;100 }&quot;&gt;${ fn:substri

博客 文章 只显示 前100个字 java 实现截取字符串!使用! <c:if test="${fn:length(onebeans.info)>100 }">${ fn:substri http://blog.csdn.net/tfy1332/article/details/22811835 2014-04-02 17:14 3406人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. <%@ taglib prefix=&qu

Linux分析日志获取最多访问的前10个IP

原文地址:http://xuqq999.blog.51cto.com/3357083/774714 apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数. 既然是统计,那么awk是必不可少的,好用而高效. 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail 首先用awk统计出来一个列表,然后用sor

2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, 该框架结合了 Web 应用和 Native 应用的

GitHub 排名前 100 的安卓、iOS项目简介

GitHub Android Libraries Top 100 简介 转自:http://www.devstore.cn/essay/essayInfo/6485.html 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这个是 Faceboo

GitHub 中国区前 100 名到底是什么样的人?

本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员如何建立自己的个人品牌><优雅的程序员列传>欢迎加我微信diycodes交流. Github中国区前一百名城市分布,令人比较意外的是IT重镇深圳和广州居然和北上杭差距那么大!(其中China表示没有注明具体城市用户) Github中国区前一百名语言分布图,前端开发者依然霸占着大多数,移动开发