快速排序_附注释

public static void main(String[] args) {
	//给出无序数组
    int[] arr={72,6,57,88,96,36,52,4,56};
    //打印无序数组
    System.out.println(Arrays.toString(arr));
    //无序数组排序
    quickSort(arr);
    //打印有序数组
    System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr) {
	int low=0;
	int high=arr.length-1;
	quickSort(low,high,arr);
}





private static void quickSort(int low, int high, int[] arr) {
	if(low<high){
		//分区
		int index=divideArea(low,high,arr);
		//先判断if条件,左分区,递归,方法执行完则递归执行下一个递归函数
		quickSort(low,index-1,arr);
		//右分区,递归
		quickSort(index+1,high,arr);
	}
}

private static int divideArea(int low, int high, int[] arr) {
	//左指针,因为需要有序(从左到右)的移动,所以取下标
	int i=low;
	//右指针,因为需要有序(从右到左)的移动,所以取下标
	int j=high;
	//设基准值,即用于分区的中间值,挖坑,将数组的第一个值作为基准值,(**可以取这次分区的平均值**)
	int x=arr[i];
	
	//判断什么时候能移动指针,移动指针(视频推荐先移动右指针,*****************先左还是先右,没关系)
	while(i<j){
		//移动右指针,j--,如果值大于基准值就一直移动,如果小于基准值,while循环会自动停止,还要保证右指针不能小于左指针(arr[j]>=x比较的是数组的值,不受外面while(i<j)的控制了,所以需要添加i<j)
		while(arr[j]>=x && i<j){
			j--;
		}
		//当上面的while循环执行完毕,而且i还小于j,则表示,现在i跟j之间有小于基准值的数,需要将其移动到左边(复制并填坑)
		if(i<j){
			arr[i]=arr[j];//将找到的右分区小于基准值的数值放到i所在的坑中,数组j位置就变成坑了(将j对应的值复制到,坑i中)
			i++;//相当于将右分区小于基准值的数值放到i所在的坑中,所以轮到左指针i移动了
		}
		//如果左指针对应的值小于基准值,移动左指针,同理上一个while
		while(arr[i]<x && i<j){
			i++;
		}
		//上面的while循环完,如果i还在j的左边,则表示i与j之间有大于基准值的数值,这是坑在j的位置,将i对应的值放入到j对应的位置
		if(i<j){
			arr[j]=arr[i];
			j--;//相当于将左分区大于基准值的数值放到j所在的坑中,所以轮到右指针j移动了
		}
	}
	
	//填最后一个坑,因为这时i与j的值相同,将一开始取的基准值放到中间
	arr[i]=x;
	//返回基准值的位置索引
	return i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值