码迷,mamicode.com
首页 > 其他好文 > 详细

寻找第k个最大数

时间:2014-08-20 18:01:12      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:java   io   for   ar   art   new   算法   on   

寻找第k个最大数,当然可用来求中值。

采用减治方法,将数组分为两个部分,与寻找值位置比较,类似二分法。重点理解当寻找结果在后半段时候,key值保持不变,《算法设计与分析基础》讲是右边数组的q-key个最大数,对于整个数组来书还是最第key个最大数。


import java.util.Scanner;

public class FindKMax {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
//		int n=scanner.nextInt();
//		int a[]=new int [n];
//		for (int i = 0; i < a.length; i++) {
//			a[i]=scanner.nextInt();
//		}
		int n=9;
		int a[]={4,1,10,9,7,12,8,2,15};
//		int n=7;
//		int a[]={4,3,2,1,6,7,5};
		int key=scanner.nextInt();
		if (key<=0||key>n) {
			System.out.println("Wrong input!");
			return;
		}
		findKMax(a, 0, n-1, key-1);
	}

	public static void findKMax(int a[], int p, int e, int key) {
		if (p<=e) 
		{
			int q=partion(a, p, e);
			if (key==q){
				System.out.println(a[q]);
			}
			else if (key>q) {
				findKMax(a, q+1, e, key);//very important understand !
			}
			else {
				findKMax(a, p, q-1, key);
			}
		}		
	}
	
	public static int partion(int a[], int p, int e)// the last is the compare Value
	{
		int x=a[e];
		int j=p-1;
		for (int i = p; i < e; i++) {
			if (a[i]<x) {
				j++;
				swap(a, i, j);
			}
		}
		swap(a, e, j+1);
		return j+1;
	}
	public static int partition(int a[], int p, int e)//the first is the compare Value
        {
		int x=a[p];
		int j=e+1;
		for (int i = e; i >p; i--) {
			if (a[i]>x) {
				j--;
				swap(a, i, j);
			}
		}
		swap(a, p, j-1);
		return j-1;
	}
	
	public static void  swap(int a[], int i, int j) {
		int t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
}


寻找第k个最大数,布布扣,bubuko.com

寻找第k个最大数

标签:java   io   for   ar   art   new   算法   on   

原文地址:http://blog.csdn.net/biruixing/article/details/38708891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!