TopN指的是从已经存在的数组中,找出最大(或最小)的前n个元素。
算法的核心就是循环数组,并将当前的最大的n个数存入一个数组topN[n]中,插入结束后对数组进行排序。当循环到第k+1个数时,与topN[0]比较,若比topN[0]大,则替换topN[0]为第k+1个数,并对topN[n]排序;若比topN[0]小,则比较下一个数。
下面是实现方法:
package com.xiva.cms.data.test; import java.util.Date; import java.util.Random; import com.xiva.cms.data.util.SortService; /** * Top N 算法 * @author XIVA * */ public class TopNAlgorithm { public static int[] datas = new int[100000000]; /** * 生成测试数据 */ public static void genarateData() { Random random = new Random(new Date().getTime()); for (int i=0; i < datas.length; i++) { datas[i] = random.nextInt(1000000000); } } /** * main 方法 * @param args */ public static void main(String[] args) { SortService<Integer> sortSrv = new SortService<Integer>(); int topN = 100; Integer[] topNData = new Integer[topN]; System.out.println("Start genarate Data."); TopNAlgorithm.genarateData(); System.out.println("End genarate Data."); // 初始化 Top N for(int i=0; i < topN; i++) { topNData[i] = 0; } System.out.println("Search for top N Starting."); // 获取TopN for ( int i = 0; i < datas.length; i++) { int num = datas[i]; if (num % 1000000 == 0) { System.out.println("Search for top N index:" + i); } if (topNData[0] < num) { topNData[0] = num; // 使用折半插入排序 sortSrv.binaryInsertSort(topNData, 1); } } for (int i = 0; i < topNData.length; i++) { System.out.println("Top N:" + topNData[i]); } System.out.println("Search for top N ended."); } }