基于JAVA的快速排序算法分析

一.算法思想解析

  1. 概念:
    我就使用自己的语言来通俗解释一下吧.
    首先给了一个数组,第一步选取一个基准数,我喜欢直接使用数组下标为[arr.length/2]的数为基准数,然后快速排序的核心思想就是第一轮让这个数组中小于该基准数的都放在其左边,大于该基准数的都放在其右边,但具体的实现是先从左边开始遍历找比基准数大的数,一旦找到就停止,此时右边开始遍历寻找比基准数小的数,一旦找到就让这两个数进行交换,然后左边进行扫描,重复操作,直到扫描到基准数结束,此时有可能一下子就变得有序了,但也有可能没有,因为基准数的左边虽然都小于等于基准数,但不代表就一定有序,此时就需要使用递归,这个时候基准数左边可以分成一个数组,右边也可以分成一个数组,然后两边使用递归操作,最终有序.
  2. 代码部分,先看代码再解释.
public class 快速排序 {

	public static void main(String[] args) {
		int[] arr= {23,54,1,243,65,43,78,6,34};
		quickSort(arr, 0, arr.length-1);
		System.out.println(Arrays.toString(arr));
	}
	/**
	 * 
	 */
	public static void quickSort(int[] arr,int left,int right) {
		int l=left;
		int r=right;
		int pivot=arr[(left+right)/2];
		int temp=0;
		//这个循环实现这一轮让中轴值左边小,右边大
		while (l<r) {	
			//循环左边
			while (arr[l]<pivot) {
				l+=1;
			}
			//循环右边
			while (arr[r]>pivot) {
				r-=1;
			}
			
			if (l==r) {//此时已经实现在中轴值左边都小于,右边都大于
				break;
			}
			temp=arr[l];
			arr[l]=arr[r];
			arr[r]=temp;
			
			if (arr[l]==pivot) {
				r-=1;
			}
			if (arr[r]==pivot) {
				l+=1;
			}
			
		}
		
		if (l==r) {//实现在左边进行递归,和右边继续递归,此时的r,等于下一个递归调用方法的right,l为left
			l+=1;
			r-=1;
		}
		//循环使用递归来分治
		if(left<l) {
			quickSort(arr, left, r);
		}
		if (right>r) {
			quickSort(arr, l, right);
		}
		
	}

}

1------->
由于需要使用递归,所以方法中传入的参数就变得清晰了,分别是[操作的数组] \ [左边指针来从数组左边开始遍历]\ [右边指针从右边开始遍历]
2-------->
首先,第一轮传入的是arr这个初始数组,左边指针为0,右边为arr.length-1,此时先定义两个局部变量l和f来让0和arr.length-1来赋值,然后再定义一个int类型变量pivot来获取数组的基准数,再定义一个容器temp来进行数据交互的中间件.
3--------->
我们继续分析代码,当我们两边都有指针扫描时,当左边的指针大于右边时就结束了,因为这个时候数组所以的数都扫描结束了,所以我们实现让基准数左边都小右边都大的实现代码都是在while(l<r){}这个里面进行的
4--------->
左边开始一直扫描,一直找到比基准数大的数据时停止,所以使用while循环来实现,退出循环的条件是:arr[l]<pivot,当找到了,退出了循环,开始轮到右边了,也是使用while循环来一直从右边一直扫描,退出条件是找到一个比基准数小的数,arr[r]>pivot,如果发现左边指针等于右边指针,就说明完成了我们的操作,可以直接break退出大循环了.如果没有的话,就可以实现最关键的功能了,让这个两个数据进行交换位置,这个代码想必不用说了.但此时有一个问题,如果我左边或者右边一直扫描到基准数都没有扫描到符合的数怎么办,所以当左边一直扫描到基准数时就停止了,让右边指针往左边移动一位,同理左边指针会往右边加一,
5--------->
当退出大循环时,此时已经实现左边小于基准数,右边大于基准数,但此时我们知道,左边指针l和右边指针r其实相等了,因为他们都在扫描到基准数时停止退出了,所以这个时候想使用递归的话,就不能坐视不管,我们可以让他们岔开,让l+1,r-1,这样等于让l这个第一轮的左边指针变成下一轮右边数组的左边指针,同理第一轮的右边指针r变成下一轮的左边数组的右指针.
6--------->
此时递归的条件是左边的数组中左边的指针,其实就是0,但此时的右边的指针为r,但我们实现了身份交换,此时r变成了l,所以当left<r就一直递归左边的数组,同理递归右边的数组就是right(就是arr.length)大于l,此时变成了r.
7--------->
到此快速排序算法就结束了,最难的就是一些细节处理,可能会让忽略.我对比了冒泡排序和快速排序的时间,当处理数据很大时,比如处理八百万数据,快速排序只要3秒,冒泡排序很久很久.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值