Java快排及快排查找第K大的数字
快速排序
public class fastsort {
public static void main(String[] args) {
int arr[]= {5,4,3,2,1};
fastsort(arr,0,4);
System.out.println(arr[0]);
}
static void swap(int arr[],int x,int y) {
int t=arr[x];
arr[x]=arr[y];
arr[y]=t;
}
static int partsort(int arr[],int begin,int end) {
int left=begin,right=end;
while(left<right) {
while(left<right&&arr[right]>arr[begin])
right--;
while(left<right&&arr[left]<arr[begin])
left++;
swap(arr,left,right);
}
swap(arr,begin,left);
return left;
}
static void fastsort(int arr[],int l,int r) {
if(l>=r)
return ;
int index=partsort(arr,l,r);
fastsort(arr,l,index-1);
fastsort(arr,index+1,r);
}
}
开始总栈溢出,经检测后发现递归的时候应该用index-1和inedx+1,务必注意。
用快速排序查找第K大的元素:
利用的思想:快速排序每一次都可以将一个数放到他的最终位置上,所以当这个数是我们要找的数时,输出,如果这个数大于我们要找的数,向这个数的左边递归,否则向右边递归。
Java实现:
static void findsort(int arr[],int l,int r,int k) {
if(l<r) {
int index=partsort(arr,l,r);
if(index==k-1)
System.out.println(arr[index]);
else if(index<k-1)
findsort(arr,index+1,r,k);
else
findsort(arr,l,index-1,k);
}
else
return ;
}