TOP K的几种算法比较

TOP K与一般的排序不一样,并不需要数组全部排序,甚至某些需求也不需要TOP K排序,所以如果原封不动地直接使用各种排序方法,然后再去取前K个,肯定是不够优化的。求数组TOP K的有好几种算法,这里列出了3种:快排的变种、基于固定数组的部分排序、冒泡的变种。代码如下:

package com.algorithm;

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

/**
 * TOP K的几种算法
 * TOP K与一般的排序不一样,并不需要数组全部排序,甚至某些需求也不需要TOP K排序,所以如果原封不动地直接使用各种排序方法,然后再去取前K个,肯定是不够优化的。
 * @author wuwenhai
 * @since JDK1.6
 * @history 2017-7-12 wuwenhai 新建
 */
public class TopK {

	public static int[] array;
	public static final int SIZE=1000000;
	public static final int K=10;
	
	public static void main(String[] args) {
		init();
		long start,end,TopK;
		
		start =System.currentTimeMillis();
		TopK=findTopByFastSort(array,0,array.length-1,K);
		end =System.currentTimeMillis();
		System.out.println("findTopByFastSort spend time: "+(end-start));
		System.out.println("TopK: "+TopK);
		
		start =System.currentTimeMillis();
		TopK=findTopByFixedArrays(array,K)[K-1];
		end =System.currentTimeMillis();
		System.out.println("findTopByFixedArrays spend time: "+(end-start));
		System.out.println("TopK: "+TopK);
		//System.out.println(Arrays.toString(findTopByFixedArrays(array,K)));
		
		start =System.currentTimeMillis();
		TopK=findTopByBubbling(array,K)[K-1];
		end =System.currentTimeMillis();
		System.out.println("findTopByBubbling spend time: "+(end-start));
		System.out.println("TopK: "+TopK);
		//System.out.println(Arrays.toString(findTopByBubbling(array,K)));
		
	}
	
	public static void init(){
		array=new int[SIZE];
		Random random=new Random();
		for(int i=0;i R || K < 1)// 检查输入参数是否合法
			return -1;
		if (L == R)// 如果L等于R说明已找到,直接返回
			return array[R];
		int temp = fastSort(array, L, R);// 进行一次快排,返回下标
		if (K + L == temp + 1)// 如果k+L等于返回的下标加1(L不一定从0开始)
			return array[temp];// 则直接返回
		if (K + L < temp + 1)// 如果k+L小于返回的下标加1
			return findTopByFastSort(array, L, temp - 1, K);// 在temp的左边查找第k大数
		else // 否则,在temp的右边部分查找第k-(temp-L+1)大数。这里,右边的第k-(temp-L+1)大数就是整个数组的第k大数
			return findTopByFastSort(array, temp + 1, R, K - (temp - L + 1));
	}
	
	/**
	 * 阉割版的快排,只进行一次排序操作
	 */
	public static int fastSort(int[] array,int L,int R){
		if(L>=R) return -1;
		int i=L;
		int j=R;
		int temp=array[i];
		while(i=temp) i++;
			if(i=R) return -1;
		int i=L;
		int j=R;
		int temp=array[i];
		while(i=temp) i++;
			if(itop[K-1]){
				top[K-1]=array[i];
				completedFastSort(top,0,K-1);
			}
		}
		return top;
	}
	
	/**
	 * 用冒泡排序的方式选出Top的K个值
	 * K值小的时候还能看,越大越差,跟上面两种已经不是一个量级了
	 * @param array
	 * @param K
	 * @return
	 */
	public static int[] findTopByBubbling(int[] array,int K){
		int[] top=new int[K];
		int temp;
		for(int k=0;k


你可能感兴趣的:(java)