选择问题:一组N个数确定其中第K个最大

一 序

  打算补一下基础的数据结构,尽量保持每周一篇,后面多了会汇总一下。先从书上的第一章引论的例子开始。

二 实现方法:

  2.1 将N个数以排序,输出第n-K个位置上的元素。(或者是递减排序,输出第K个位置)

public class Kmax {
	
	private  static final Random r = new Random();

	public static void main(String[] args) {
	
		long t1 = System.currentTimeMillis();
		int k  = r.nextInt(10);

		int a[] = new int [1000];

	
	
		for(int i = 0;i < a.length ;i ++)
		{
			a[i] =r.nextInt(5000);
		}

		System.out.println("a[]:"+JSON.toJSON(a));
		System.out.println("k="+k);
		
	

		
	
		int result = kmax1(a,k);
		System.out.println("pop use:"+(System.currentTimeMillis()-t1));
		
		
		//	int  result = kmax2(a,k);
		//	System.out.println("quicksort use:"+(System.currentTimeMillis()-t1));
		
	}

	public static int kmax1(int a[],int k){
		
		int t = 0;
		for(int i = 0;i < a.length; i++)
			for(int j = 0;j < a.length-1-i; j++)
			{
				if(a[j+1] > a[j])
				{
					t = a[j];
					a[j] = a[j+1];
					a[j+1] = t;
				}
			}
		
		System.out.println("num="+a[k-1]);
		
		return a[k-1];		
	}
	
	public static int kmax2(int a[],int k){
		Arrays.sort(a);
		
		System.out.println("num="+a[a.length-k]);
		return a[a.length-k];
	}
	
	
	
}

作为对比, 用了jdk自带的sort.

k=6
num=4949
pop use:7

k=1
num=4990
quicksort use:1

2.2 先把前K个元素读入数组并对其降序顺序排序,再将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中第K个元素则忽略,否则就将其放到数组的正确位置上,同时将数组的一个元素挤出数组。算法终止时,位于第K个位置上的元素即为所求。(好吧,我有偷懒了,因为jdk没有自带的降序,所以做个临时变量数组b,用来保存前面K个元素,升序排序保证b[0]最小,后面的插入逻辑类似)

public class Kmax2 {
	
	private  static final Random r = new Random();

	public static void main(String[] args) {
		long t3 = System.currentTimeMillis();
		int k  = r.nextInt(10);
		System.out.println("k="+k);
		int a[] = new int [1000];
		int b[] = new int [k];
		for(int i = 0;i < k; i++)
		{
			a[i] = r.nextInt(5000);
			b[i] = a[i];
		}
		//System.out.println("a[]:"+JSON.toJSON(a));
		
		for(int i = k;i < a.length ;i ++)
		{
			int tmp =r.nextInt(5000);
			a[i] = tmp;
			if(tmp>getmin(b)){
				b[0] = tmp;
				getmin(b);
			}
		}
		
		//System.out.println("a[]:"+JSON.toJSON(a));
		System.out.println("num="+b[0]);
		System.out.println("use:"+(System.currentTimeMillis()-t3));	
		
		
	}
	
	public static int getmin(int a[]){
		Arrays.sort(a);		
		
		return a[0];
	}
	
	
	
}

输出结果: 

k=8
num=4933
use:1

当然这两种对于大数据量千万级的随机数,效果都很慢。不是最好办法,等后面看到了在补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值