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));
}
}
编程之美--求最大的K个数(快速排序原理实现)
最新推荐文章于 2025-04-02 20:31:10 发布
