您的位置:首页 > 其它

快速排序+随机快速排序

2018-02-04 10:52 399 查看
public class Main {

/**
* @param args
*/
//随机快速排序
//原理 不断的将一个基准左右有序 然后返回基准的左右下标
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {0, -4, -1, 6, 8, 8, 53, 15};
RandomquickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));

}
public static void quickSort(int[] arr,int L,int R){
if(L<R){
//随机的话默认以最后一个数为基准递归下去
int[] p = partition(arr,L,R);
quickSort(arr,L,p[0]);
quickSort(arr,p[1],R);
}
}
//随机快速排序 从 R-L中找一个随机位置 交换到最后
public static void RandomquickSort(int[] arr,int L,int R){
if(L<R){
swap(arr,R,(int)(Math.random()*(R-L))+1);
int[] p = partition(arr,L,R);
quickSort(arr,L,p[0]);
quickSort(arr,p[1],R);
}
}

//默认以最后一个数为基准
public static int[] partition(int[] arr,int L,int R){
int left = L-1;
int right = R;
while(L<right){
if(arr[L]<arr[R]){
swap(arr,L++,++left);
}else if(arr[L]>arr[R]){
swap(arr,L,--right);
}else{
L++;
}
}
//将最后那个基准 与 右边范围第一个数交换 ----寓意交换到中间
swap(arr,right,R);
//不建议使用 L++ 因为到最后会不知道left的正确值
return new int[]{left,right+1};//返回的是刚好能把数组分成两半的值
}
public static void swap(int[] a,int i,int j){
int temp = a[i];
a[i] = a[j];
a[j]=temp;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: