Java的快速排序法代码分步解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36798272/article/details/89848133

刚开始看快速排序的时候,还是有点懵的,虽然大体意思上算是了解了,但是整体流程还不够清晰,网上已经有很多分析快速排序的博客了,介绍的话不在这里说了,写下这篇博客就是为了以后再看快排的时候可以快速复习。

以下分为两个部分,第一部分为代码部分,第二部分为分步讲解,两部分对比着看。

一 代码区

public class QuickSort {
	private static int count;
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		int[] num = {3,45,78,52,2};
		System.out.println(arrayToString(num,"未排序"));
		QuickSort(num,0,num.length-1);
		System.out.println(arrayToString(num,"排序"));
		System.out.println("数组个数:"+num.length);
		System.out.println("循环次数:"+count);
		
	}
	/**
	 * 快速排序
	 * @param num	排序的数组
	 * @param left	数组的前针
	 * @param right 数组后针
	 */
	private static void QuickSort(int[] num, int left, int right) {
		//如果left等于right,即数组只有一个元素,直接返回
		if(left>=right) {
			return;
		}
		//设置最左边的元素为基准值
		int key=num[left];
		//数组中比key小的放在左边,比key大的放在右边,key值下标为i
		int i=left;
		int j=right;
		while(i<j){
			//j向左移,直到遇到比key小的值
			while(num[j]>=key && i<j){
				j--;
			}
			//i向右移,直到遇到比key大的值
			while(num[i]<=key && i<j){
				i++;
			}
			//i和j指向的元素交换
			if(i<j){
				int temp=num[i];
				num[i]=num[j];
				num[j]=temp;
			}
		}
		num[left]=num[i];
		num[i]=key;
		count++;
		QuickSort(num,left,i-1);
		QuickSort(num,i+1,right);
	}

	/**
	 * 将一个int类型数组转化为字符串
	 * @param arr
	 * @param flag
	 * @return
	 */
	private static String arrayToString(int[] arr,String flag) {
		String str = "数组为("+flag+"):";
		for(int a : arr) {
			str += a + "\t";
		}
		return str;
	}
 
}

二 分步分析

1、首先准备一个数组:
在这里插入图片描述
2、目前各变量的值:

left=0
right=4
key=3	
i=0	
j=4

3、首先j开始左移,直到找到比key值小的值为止,结果第一个值就比key小,所以j依然为4
4、接下来i开始右移,直到找到比key值大的值为止,当i移动到索引1时,值大于key值,所以i的值变更为1
5、索引i的值与索引j的值交换,数组变更为如下:
在这里插入图片描述
6、目前各变量的值:由于i<j,所以重复第三步和第四步的操作。

left=0
right=4
key=3
i=1
j=4

7、j继续左移,寻找比key小的值,最后j停留在索引为1的位置
8、由于i等于j所以不再右移
9、退出循环,各变量如下

left=0
right=4
key=3
i=1
j=1

10、数组索引为0的值与索引为i的值交换,这样i左边的值都比i小,右边的值都比i大,数组如下图:
在这里插入图片描述
11、此时数组被分割成两部分,两部分如下:
在这里插入图片描述
12、第二部分与前面的操作类似,不再赘述。
第一部分只有一个值,目前left=0,right=0,这将会因为以下代码结束排序

//如果left等于right,即数组只有一个元素,直接返回
if(left>=right) {
   return;
}

猜你喜欢

转载自blog.csdn.net/qq_36798272/article/details/89848133