排序算法:求 长度为 n的 数组中,最大的 m个数

排序:数组 length=m,从其中中取出最大的 n 数字,n<=m

 

 

import java.util.Random;
import java.util.TreeSet;

/** 
 * 排序算法:数组 length=m,从其中中取出最大的 n 数字,n<=m
 * 思路:用 TreeSet 存放结果,可以自动排序,先取前100个放到 TreeSet,然后遍历其余的,如果大于 TreeSet 中最小的,则删除 TreeSet 中最小的值,并将新值放到 TreeSet 中,
 */
public class TopMax {
	/** 
	* 如果数字不在 treeset 里,则加入,并返回 true。 
	* 如果数字在 treeset 里,则不加入,并返回 false。 
	* @param ts 
	* @param newData 
	* @return 
	*/
	private static boolean doTop(TreeSet<Integer> ts, int newData) {
		if (ts.contains(newData)) {
			return false;
		}
		ts.remove(ts.first());
		ts.add(newData);
		return true;
	}

	private static void test(int numberCount, int topNum) {
		System.out.println("Sort begin...");

		long current = System.currentTimeMillis();

		int min = 0;

		int maxNumber = numberCount;
		Random random = new Random();
		random.setSeed(System.currentTimeMillis());
		TreeSet<Integer> ts = new TreeSet<Integer>();

		for (int i = 0; i < topNum; ++i) {
			int newData = random.nextInt(maxNumber);
			ts.add(newData);
		}
		min = ts.first();
		for (int i = topNum; i < numberCount; ++i) {
			int newData = random.nextInt(maxNumber);
			if (newData > min) {
				if (doTop(ts, newData)) {
					min = ts.first();
				}
			}
		}
		System.out.println(numberCount + " top " + topNum + " within " + (System.currentTimeMillis() - current) + " millseconds");
		System.out.println(ts);
		System.out.println("Sort end");
	}

	public static void main(String[] args) {
		test(100000000, 100);
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值