/*
* 随机快排
*
* 使用数组的最后一位为基准进行排序,
* 初始化两个变量less和more,表示小于和大于这个数的数的边界,遍历数组,
* 若是小于这个数,将less+1位置上的数与这个数进行交换,less+1,l+1
* 若是大于这个数,将more-1位置上的数与这个数进行交换,more-1,l不变
* 若是等于这个数,l+1
* 遍历完之后,将最后一个数与more的第一个数进行交换
* 返回排序数的边界
* 左右两边继续重复,直到全部排序完成
*/
public static void quickSort(int[] arr){
//排除空数组和长度为一的数组
if(arr==null||arr.length<2){
return;
}
quick(arr,0,arr.length-1);
}
public static void quick(int[] arr,int l,int r){
//排除空数组和长度为一的数组
if(l<r){
//从数组中随机找一个数作为排序数
swap(arr,l+(int)((r-l+1)*Math.random()),r);
int[] p = partition(arr,l,r);
quick(arr,l,p[0]-1);
quick(arr,p[1]+1,r);
}
}
//进行排序,并且返回排序数的边界
public static int[] partition(int[] arr,int l,int r){
//比arr[r]小的数
int less = l-1;
//比arr[r]大的数,因为是以r为准排序,所以不用+1
int more = r;
while(l<more){
if(arr[l]<arr[r]){
swap(arr,++less,l++);
}else if(arr[l]>arr[r]){
swap(arr,--more,l);
}else{
l++;
}
}
swap(arr,more,r);//因为是以最后r位置上的数进行快排,所以在最后将r位置上的数换到中间
return new int[]{less+1,more};//返回排序数的边界
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
随机快排(基于荷兰国旗问题)
猜你喜欢
转载自blog.csdn.net/liu_xiansen/article/details/82804424
今日推荐
周排行