快速排序实例

快速排序:先选取数组中的一个数作为基准值,然后将数组中大于基准值的放在它的右边,将数组中小于基准值的放在它的左边,此时基准值就在数组的中间位置;然后分别对基准值左边和基准值右边的值分别执行上述操作,以达到数组有序。

package com.mrz.test;


/*
 * 2022-03-21
 * mrz
 * 快速排序
 */
public class QuickSort {

	public static void main(String[] args) {
		int[] arr = {6,9,5,7,4};
		Quick(arr, 0, arr.length-1);
		for(int i = 0;i < arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
	
	public static void Quick(int[] arr,int L,int R) {
		if(L>=R)
			return ;
		int left=L,right=R;
		int pivot = arr[left];			//设置中心轴
		while(left<right) {				//条件:下标值左边比右边小,否则结束循环(因为如果左边不小于右边则说明排序已经结束)
			while(left<right&&arr[right]>=pivot) {			//左下标小于右边下标,数组右侧下标值大于等于中心轴,则右侧下标自减
				right--;
			}
			if(left<right) {				//这里其实不需要太关注判断条件,代码按顺序执行,这里相当于不满足上面的while循环后的执行代码
				arr[left]=arr[right];			//说明右侧的值比中心轴小,将右侧下标为right的值赋给左下标,实现比中心轴小的数都放在中心轴的左边
			}
			while(left<right&&arr[left]<=pivot) {			//如果左下标小于右下标,并且数组左下标的值小于等于中心轴,则左下标自增,相当于左下标向右移动一位
				left++;
			}
			if(left<right) {				//这里其实不需要太关注判断条件,代码按顺序执行,这里相当于不满足上面的while循环后的执行代码
				arr[right]=arr[left];		//说明左侧的值比中心轴大,将左侧下标为left的值赋给右下标,实现比中心轴大的数都放在中心轴的右边
			}
			if(left>=right) {			//如果左下标大于等于右下标,则说明排序结束,也就是已经把中心轴分好了,左边是小于中心轴的值,右边是大于中心轴的值
				arr[left]=pivot;		//将中心轴赋值给左下标(或右下边)位置
			}
		}
		Quick(arr,L,right-1);		//用递归分别对左侧值进行排序,需要注意的是别把这里的两个方法写到上面的while循环里面了
		Quick(arr, right+1, R);		//用递归对右侧值进行排序
	}
	
	
}

如果还是不懂可以私信我或者看下下面的视频,个人觉得比较容易理解

快速排序算法_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值