快速排序

  • 快速排序

下面说下我对于快速排序的理解,首先它是排序算法中一种,既然是排序那么自然少不了最基本的 比较、交换、循环,
快速排序可以称其为单轴快排,这个轴就是你选中的一个基准,在一串需要排序的数字中选择一个轴,然后将其余全部的数字与这个选中的轴进行比较,比这个轴小的放在左边,比这个轴大的放在右边,此时就相当于将数组分成了两个部分,然后在各个部分重复上面的操作,即可完成快速排序。

废话不多说,直接上代码
对于轴的选择,我们每次都选择需要进行排序数组的最后一个数为轴,然后将剩下的所有数与其进行比较,根据其原理会用到迭代

leftbound 为需要进行排序数组的左边界(下标)
rightbound 为需要进行排序的数组的右边界(下标) array.length() -1 
public static int partition(int[] array,int leftbound,int rightbound) {
		//中间的轴
		int pivort = array[rightbound];
		//左指针
		int left = leftbound;
		//右指针
		int right = rightbound-1;
		System.out.println("========="+right);
		//此处 <= 当只剩下两个数比较时,如果左边的数大于右边的数,那么如果条件为left<right 则不会进行循环,那么两个数不会进行交换,则出现bug
		while(left <= right) {
			//从左边界开始,进行遍历
			while(left <= right && array[left] <= pivort) {left++;}
			//System.out.println("========="+right);
			//从右边界开始,进行遍历
			while(left <= right && array[right] > pivort) {right--;}
			//System.out.println("========="+right);
			System.out.println("交换左边下标"+left+"交换右边下标"+right);
			//当左指针遇见比轴大的数时,跳出循环(内部左while),右指针遇见比轴小的数时,跳出循环(内部右while)将两数进行交换,继续遍历
			if(left < right) swap(array,left,right);
		}
		//一次循环遍历完成之后,将此左指针指向的数与最后一个数(轴)进行交换
		swap(array,left,rightbound);
		
		//int mid = left;
		//System.out.println("========="+mid);
		//print(array);
		//返回左指针,此时左指针的位置将数组分成了两个部分,为下次再次进行循环遍历提供了左边界和右边界
		return left;
	}
举个例子,现在有一个班的学生需要站队高低个,那么每次选择最后一个同学的身高为基准,然后有两个老师一个从第一个开始往后面数,直到碰见比最后一个同学高的或者遇见第二个老师停下来;另外一个从倒数第二个往前面数,直到碰见比最后一个矮的或者碰见第一个老师停下来;如果有身高不符合的就将两个同学交换,再继续往后面数,直到两个老师遇见 则停下来,将第一个老师指的同学与后面最后一个同学进行交换,每个分组都这样完成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值