找出数组的第k大个数

思路:

由于快排每趟排序,排好一个元素、以递归的方式、对排好序的元素的两边再继续排序
【前半部分小于当前元素值、后半部分大于当前值】。
查找第k大个元素时,先执行一次快排,判断排序好的位置、若不为k,比较大于k
第k个元素一定在小于k-1的位置、否则一定在大于k+1的位置
例:
    查找第k=5大元素
        3 1 4 2 8 5
   1趟   2 1 3 4 8 5      i=2    i+1<k

   2趟  2 1 3 4 8  5      i=3   i+1<k

   3趟  2 1 3 4 5 8       i=5   i+1>5

   4趟  2 1 3 4 5 8        i=4  i+1=5   找到元素为5

注:本排序过程可看做二分法与快排的特点结合
public static  void find(int[] array,int begin,int end,int k){
        int i=partition(array,begin,end);
        //找出i+1大的数与k比较
        if(i+1>k){
            find(array,begin,i-1,k);
        }else if(i+1<k){
            find(array,i+1,end,k);
        }else{
            System.out.println("找到了:"+array[i]);
            return;
        }
    }
    //一趟快排
    public static int partition(int[] array,int begin,int end){
        if(begin<end){
            int key=array[begin];
            while(begin<end){
                while(begin<end&&array[end]>key){
                    end--;
                }
                if(begin<end){
                    array[begin]=array[end];
                    begin++;
                }
                while(begin<end&&array[begin]<key){
                    begin++;
                }
                if(begin<end){
                    array[end]=array[begin];
                    end--;
                }
            }
            array[begin]=key;
        }
        return begin;       
    }

猜你喜欢

转载自blog.csdn.net/linkingfei/article/details/81779071