原创
利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html
array代表存放数列的数组,K代表第K大的数,mid代表一趟快速排序后返回的基准记录下标;
一趟快速排序下来若基准记录存在的位置满足:array.length-mid==K,则说明array[mid]即是第
K大的数,若小于K,说明第K大的数在区间 [ left , mid-1 ],大于K说明在区间 [ mid+1,right ];
import java.util.*; public class 算法分析与设计2_3_选做 { static int array[]; static int K; static int mid; static int yiSort(int left,int right) { //一趟快速排序 int x=array[left]; //存储基准记录 while(left<right) { while(left<right && array[right]>=x) { right--; } if(left<right) { array[left]=array[right]; left++; } while(left<right && array[left]<x) { left++; } if(left<right) { array[right]=array[left]; right--; } } array[left]=x;//基准记录归位 return left; } static void fun(int left,int right) { mid=yiSort(left,right); if(array.length-mid==K) { return; } if(array.length-mid<K) { fun(left,mid-1); }else { fun(mid+1,right); } } public static void main(String[] args) { Scanner reader=new Scanner(System.in); System.out.print("求数组中第K大的数:"); K=reader.nextInt(); System.out.print("输入数组大小(数组大小>=K):"); int n=reader.nextInt(); array=new int[n]; System.out.print("输入数组元素:"); for(int i=0;i<n;i++) { array[i]=reader.nextInt(); } fun(0,n-1); System.out.println(array[mid]); } }
16:31:24
2018-10-06