//要求:给定一个无序的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]+" ");
}
}