从一亿个随机数里寻找前100个最大的数,如果根据常规的快速排序排完一亿个数,再取前100个数,那么耗时11~12s(VM内存设置 :-Xms256m -Xmx1024m),因为只需要取前100个最大值,所以不必全都排序,只需根据快速排序的思想,判断pivot的当前位置 i 与99(第100个数组下标)的关系:
quickSortTop(int[] arr, int start, int end)
如果i等于99,那么数组前100个元素肯定是最大的(排在pivot左边的数都比右边的大),退出递归,
如果i小于99,那么在(i,end]里查找前100-(i+1)最大值,即继续递归,
如果i大于99,那么在[0,i-1]里查找前100个,即继续递归。
变形到的快排查找到,耗时在400~900ms,相比之下耗时减少了一个数量级,下面是测试代码:
package com;
import java.util.Random;
public class TestQuickSortWithin100 {
// 一亿个数
private static final int NUMBER = 10000 * 10000;
// 前100个数
private static final int TOPNUMBER = 100;
public static void main(String[] args) {
int[] arr = new int[NUMBER];
// 随机生成一亿个数
Random random = new Random();