有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
说这一行代码数组越界int mid = partition(a,left,right);
case通过率为0.00%
Exception in thread "main" java.lang.StackOverflowError
at Finder.quickSort(Finder.java:31)
import java.util.*;
public class Finder {
//交换方法
public void swap(int []a,int l,int r){
int temp;
temp = a[r];
a[r] = a[l];
a[l] = temp;
}
//一次快排
public int partition (int []a, int left ,int right){
while(left<right){
while(left<right&&a[right]>a[left]){
right--;
}
if(left<right)
swap(a,left,right);
while(left<right&&a[left]<a[right]){
left++;
}
if(left<right)
swap(a,left,right);
}
return left;
}
//快排算法
public void quickSort(int[]a ,int left, int right ){
int mid = partition(a,left,right);
quickSort(a,left,mid-1);
quickSort(a,mid+1,right);
}
public int findKth(int[] a, int n, int K) {
// write code here
quickSort(a,0,n-1);
return a[K-1];
}
}
quickSort自身递归调用了,无法退出,相当于死循环
代码就不仔细看了,错误太多,快排、分区都不对,直接参考下面的吧
/*******************************************************
*快速排序 (比较排序类)
*每次排序将待排记录分割两部分,一部分都比关键字小,一部分都比关键字大
********/
public void quickSort(int[] L) {
Qsort(L,1,L.length-1);
}
public void Qsort(int[] L,int low,int high) {
int pivot;
if(low<high) {
//将L[low,high]一分为二,算出枢轴值pivot,该值得位置固定,不用再变化
pivot=partition0(L,low,high);
//对两边的数组分别排序
Qsort(L,low,pivot-1);
Qsort(L,pivot+1,high);
}
}
// 选择一个枢轴值(关键字) 把它放到某个位置 使其左边的值都比它小 右边的值都比它大
public int partition0(int[] L,int low,int high) {
int pivotkey;
pivotkey=L[low];
//顺序很重要,要先从右边找
while(low<high) {
while(low<high && L[high]>=pivotkey) { //从后往前找到比key小的放到前面去
high--;
}
swap(L,low,high);
while(low<high && L[low]<=pivotkey) { //从前往后找到比key大的 放到后面去
low++;
}
swap(L,low,high);
} //遍历所有记录 low的位置即为 key所在位置, 且固定,不用再改变
return low;
}
//交换数组的两个位置
public void swap(int[] L,int i,int j) {
int temp=L[i];
L[i]=L[j];
L[j]=temp;
}