编程之美--求最大的K个数(快速排序原理实现)

本文介绍了一种基于快速排序思想的算法,用于从数组中高效地找出最大的K个数。该方法通过随机选取基准值将数组划分为两部分,并递归地在相应子数组中寻找目标元素。
import java.util.Arrays;
import java.util.Random;

/**
 * 求最大的K 个数,利用快速排序的思想,找出个一个数,将数组分成两个,Sa,Sb,满足 {Sa}>{Sb}
 * 
 * @author Administrator
 * 
 */
public class getMaxK {
    static final Random rdm = new Random();

    /**
     * 求数组的最大K 个数
     * 
     * @param array
     * @param len
     * @param k
     */
    static int[] execute(int[] array, int len, int k) {
	if (k <= 0 || array == null)
	    return null;
	if (k >= len)
	    return Arrays.copyOf(array,len);			//注意:这里要返回 数据的 一段,而 不是直接返回  array,因为array在 len 以外的空间并不由程序负责
	DoubleArray da = new DoubleArray(array, len);		//将其分为两个数组
	int[]a = execute(da.a,da.alen,k);			//在 a 中继续找出  k 个元素	
	int[]b = execute(da.b,da.blen,k-da.alen);		// 在 b 中找出 k - da.leng个元素
	return append(a,b);
    }

    static int[] append(int[] a,int[] b) {			//将两个数组进行合并
	if (a == null)
	    return b;
	if (b == null)
	    return a;
	int alen=a.length,blen=b.length;
	int[] array = new int[alen+blen];
	int k = 0;
	for (int i = 0; i < alen; i++)
	    array[k++] = a[i];
	for (int i = 0; i < blen; i++)
	    array[k++] = b[i];
	return array;
    }

    static class DoubleArray {
	int[] a;
	int[] b;
	int alen, blen;

	public DoubleArray(int[] array, int len) {
	    int k = rdm.nextInt(len); // 随机一个数做为基准
	    a = new int[len];
	    b = new int[len];
	    swap(array, 0, k);
	    int basic = array[0];
	    for (int i = 1; i < len; i++) {// 小于基准的放在 b 中,大于的 放在 a 中
		if (array[i] > basic)
		    a[alen++] = array[i];
		else
		    b[blen++] = array[i];
	    }
	    b[blen++] = basic;
	}

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

    public static void main(String args[]) {
	int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int[] ans = execute(array, array.length, 4);
	System.out.println(Arrays.toString(ans));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值