找出数组中的第K大的元素

来源:互联网 发布:sql限制返回条数 编辑:程序博客网 时间:2024/05/20 06:50

问题描述

找出数组中的第K大的元素,时间复杂度为O(n)

代码

public class FindK {    //随机取一个基准数pivot,然后遍历数组一次,比基准数大的逐一的放在最前面,最后返回基准数的位置    //并且次基准数在a[left...right]中是第(k-left+1)大的元素    public static int randomPartition(int[] a,int left,int right){        int pivot=a[right],k=left-1;        for(int i=left;i<=right;i++){            if(a[i]>pivot){                int temp=a[i];                a[i]=a[++k];                a[k]=temp;            }        }        int t=a[right];        a[right]=a[++k];        a[k]=t;        return k;    }    //得到第K大的元素    public static int getMaxK(int[] a,int k,int left,int right){        int maxK=randomPartition(a,left,right);        //num表示是第a[maxK]是第num大        int num=maxK-left+1;        if(num==k)            return a[maxK];        else if(num<k)            return getMaxK(a,k-num,maxK+1,right);        else            return getMaxK(a,k,left,maxK-1);    }    //验证    public static void main(String[] args) {        int[] a={12012, 3, 945, 965, 66, 232, 65, 7, 8, 898, 56, 878, 170, 13, 5};        //依次求出第i大的元素最后打印的结果是降序排列        for(int i=0;i<a.length;i++){            System.out.println(getMaxK(a,i+1,0,14));        }    }}
0 0
原创粉丝点击