寻找第k个最大数

来源:互联网 发布:淘宝客采集工具 编辑:程序博客网 时间:2024/06/05 06:40

寻找第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;}}


0 0
原创粉丝点击