您的位置:首页 > 其它

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

2017-08-26 20:39 441 查看
//要求:给定一个无序的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]+" ");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐