随机快排(基于荷兰国旗问题)

/*
 * 随机快排
 * 
 * 使用数组的最后一位为基准进行排序,
 * 	初始化两个变量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
今日推荐