之前写的博客里已经实现过了快速排序,这里就不在介绍
//通过快速排序的partition操作找到第N大元素
public class Quick_find {
private int N;
private int arr[];
public Quick_find(int n,int[] arr) {
assert(n<=arr.length);
N = n;
this.arr=arr;
}
private void huan(int[] arr,int i,int j){
int c;
c=arr[i];
arr[i]=arr[j];
arr[j]=c;
}
public void quick_find(){
int n=arr.length;
__quick_find(arr,0,n-1,N-1);
}
private void __quick_find(int arr[],int l,int r,int index){
if(l>r){
return;
}else if(l==r){
System.out.println("第"+N+"大元素为:"+arr[l]);
return;
}
int p=__partition(arr,l,r);
if(p==index){
System.out.println("第"+N+"大元素为:"+arr[p]);
return;
}
if(p<index){
__quick_find(arr,p+1,r,index);
}
if(p>index){
__quick_find(arr,l,p-1,index);
}
}
//对arr[l,r]进行__partition操作
//返回p,使得arr[l,p-1]<arr[p];arr[p+1,r]>arr[p]
private int __partition(int arr[],int l,int r){
int v=arr[l];
//使得arr[l+1...j]<v;arr[j+1..r)>v
int j=l; //j指向小于v的左侧数据最后一个元素
for(int i=l+1;i<=r;i++){
if(arr[i]<v){
huan(arr,j+1,i);
j++;
}
}
huan(arr,l,j);
return j;
}
public static void main(String[] args) {
int arr[] =MAIN.geneateArrays(15);
for(int i=0;i<arr.length;i++){
System.out.print(" "+arr[i]);
}
System.out.println();
Quick_find q=new Quick_find(11,arr);
q.quick_find();
MAIN.mergesort(arr,arr.length);
for(int i=0;i<arr.length;i++){
System.out.print(" {"+(i+1)+":"+arr[i]+"}");
}
}
}
结果如图: