找出数组中第K个最大的数

//要求:给定一个无序的int型数组,找出其中第K大的数并输出
/*
思路:
既然是无序,首先就给它排个序,一般就用快排或者堆排序搞定吧。当然也有偷懒的Arrays.sort(arr),但是这就是耍小聪明了。

然后假如是从小到大排序,就逆序遍历数组,若数组元素不重复,直接返回arr[arr.length-K]就可以了,但若考虑到可能有重复的情况,那就需要在遍历过程判断前一个数跟当前的数是否相同,相同的话继续往前走,直到碰到不一样的数才算是从第N大的数到了第N+1大的数。

**/

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author Tom Qian
 * @email tomqianmaple@outlook.com
 * @github https://github.com/bluemapleman
 * @date 2017年8月26日
 */
public class ShanBao
{
    public static int kBiggest(int[] array,int K) {
        quickSort(array,0,array.length-1);

        int count=1;
        for(int i=array.length-1;i>0;i--){
            if(count==K)
                return array[i];
            if(array[i-1]!=array[i]){
                count++;
            }
        }
        return array[0];
//      Arrays.sort(array);
//        return array[array.length - K];
    }

    public static void quickSort(int[] arr,int start,int end){
        if(start>=end)
            return;

        boolean leftFlag=false,rightFlag=false;

        int pivot=start;
        while(!(leftFlag && rightFlag)){
            leftFlag=true;rightFlag=true;
            //第一轮:第一个元素从右边开始找第一个比它小的元素,与之交换位置
            for(int i=end;i>pivot;i--){
                if(arr[pivot]>arr[i]){
                    exchange(arr, pivot, i);
                    pivot=i;
                    rightFlag=false;
                }
            }
            for(int i=start;i<pivot;i++){
                if(arr[pivot]<arr[i]){
                    exchange(arr, pivot, i);
                    pivot=i;
                    leftFlag=false;
                }
            }
        }

        quickSort(arr, start, pivot-1);
        quickSort(arr, pivot+1,end);
    }

    public static void exchange(int[] arr,int x,int y){
        int temp=arr[x];
        arr[x]=arr[y];
        arr[y]=temp;
    }

    public static void main(String[] args)
    {
//      Scanner scan=new Scanner(System.in);
//      String[] strArr=scan.nextLine().split(" ");
//      int[] arr=new int[strArr.length];
//      for(int i=0;i<arr.length;i++)
//          arr[i]=Integer.parseInt(strArr[i]);
//      int K=scan.nextInt();
        int arr[]={4,2,6,7,7,8,2,1,1,0};
        int K=8;
        System.out.println(kBiggest(arr, K));

    }

    public static void outputArr(int[] arr){
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值