Java快速排序总结

快速排序总结。

 

工作了也有些时日了,在自己做过的java项目中呢,确实没有自己写过排序到项目中去,而自己掌握的只是一个简单的冒泡排序,随着时间的积累,对于程序的性能也越来越关注,因此也更加关注于自己的技能细节方面的改进,因此今天来写一下快速排序的思想和算法,也算是一种提升。

 

快速排序介绍:

快速排序,根据教科书上的说法来看,是冒泡排序的一种改进。接下来就用个人思想来解释这快速排序的概念吧:

快速排序,由一个待排序的数组(array),以及找准三个变量,一个是中枢值(这里定义为pivot),左值(这里定义为left),右值(这里定义为right);我们根据中数值(pivot)来做调整,每一次的改变,都将数组(array)分成 三个部分:

第一部分:中枢值(一个单独的数字构成),这个值在每一次排序好的“最中间”

第二部分:左边数组(由array的一部分值组成),这个数组在 第一部分 中枢值(pivot)的“左边”,其中左边数组中的每一个值(不一定是排好序的,可能是乱序的),都比中枢值和右边数组的值要小

第三部分:右边数组(由array的一部分值组成),这个数组在 第一部分 中枢值(pivot)的“右边”,其中右边数组中的每一个值(不一定是排好序的,可能是乱序的),逗比中枢值和左边数组的值要大

 

以上就是快速排序要做的第一步,将数组按照 : 左边数组、中枢值、右边数组 区分开来

然后根据递归思想,对 左边数组、右边数组 不断的递归调用,然后最终达到从小到大的一个排序

 

什么是递归?

递归通俗来讲就是通过某种规则,不断的调用自身,然后来达到某种目的。

 

接下来就用程序片段来将核心代码贴出:

根据注释来详细理解就行

 

 

       /**
	 * 快速排序调用方法
	 * @param ary   待排序数组
	 * @param left  左值
	 * @param right 右值
	 * @return
	 */
	public static int getSortNum(int ary[], int left, int right) {
		// 定义一个中枢值pivot,让其等于数组的左值,枢轴选定后永远不变,最终在中间,前小后大
		int pivot = ary[left];
		while(left < right) {
			// 看后面ary[right] > pivot比较,如果右边数组值大于中枢值,说明不需要调整位置,则让右值(right)自减1
			while(left < right && ary[right] > pivot)
			{
				right--;  // 执行自减操作
			}
			// 如果上面循环不符合条件的,则说明右边数组的一个值,小于中枢值(pivot),则将其替换到左边数组中
			ary[left] = ary[right];
			// 看后面ary[left] < pivot比较,如果左边数组值小于中枢值,说明不需要调整位置,则让左值(left)自增1
			while(left < right && ary[left] < pivot)
			{
				left++;  // 执行自增操作
			}
			// 如果上面循环不符合条件,则说明左边数组的一个值,大于中枢值(pivot),则将其替换到右边数组中
			ary[right] = ary[left];
		}
		// 最后将中枢值给自增后的左边数组的一个值中
		ary[left] = pivot;
		// 返回左边数组下标
		return left;
	}


以下快速排序递归调用方法:

 

 

       /**
	 * 快速排序递归方法
	 * @param ary   待排序数组
	 * @param left  左值
	 * @param right 右值
	 * @return
	 */
	public static void quickSort(int ary[], int left, int right) {
		// 定义中枢值
		int pivot;
		// 判断
		if(left < right)
		{
			// 根据方法得到了每次中枢值的位置
			pivot = getSortNum(ary, left, right);
			// 根据中枢值(pivot),来对左边数组进行递归调用快速排序
			quickSort(ary, left, pivot-1);
			// 根据中枢值(pivot),来对右边数组进行递归调用快速排序
			quickSort(ary, pivot+1, right);
		}
	}

 

 

 

 

 

以上就是快速排序核心代码片段,下面来一份完整的快速排序代码:

 

public class QuickSort {
	
	/**
	 * 快速排序调用方法
	 * @param ary   待排序数组
	 * @param left  左值
	 * @param right 右值
	 * @return
	 */
	public static int getSortNum(int ary[], int left, int right) {
		// 定义一个中枢值pivot,让其等于数组的左值,枢轴选定后永远不变,最终在中间,前小后大
		int pivot = ary[left];
		while(left < right) {
			// 看后面ary[right] > pivot比较,如果右边数组值大于中枢值,说明不需要调整位置,则让右值(right)自减1
			while(left < right && ary[right] > pivot)
			{
				right--;  // 执行自减操作
			}
			// 如果上面循环不符合条件的,则说明右边数组的一个值,小于中枢值(pivot),则将其替换到左边数组中
			ary[left] = ary[right];
			// 看后面ary[left] < pivot比较,如果左边数组值小于中枢值,说明不需要调整位置,则让左值(left)自增1
			while(left < right && ary[left] < pivot)
			{
				left++;  // 执行自增操作
			}
			// 如果上面循环不符合条件,则说明左边数组的一个值,大于中枢值(pivot),则将其替换到右边数组中
			ary[right] = ary[left];
		}
		// 最后将中枢值给自增后的左边数组的一个值中
		ary[left] = pivot;
		// 返回左边数组下标
		return left;
	}
	
	/**
	 * 快速排序递归方法
	 * @param ary   待排序数组
	 * @param left  左值
	 * @param right 右值
	 * @return
	 */
	public static void quickSort(int ary[], int left, int right) {
		// 定义中枢值
		int pivot;
		// 判断
		if(left < right)
		{
			// 根据方法得到了每次中枢值的位置
			pivot = getSortNum(ary, left, right);
			// 根据中枢值(pivot),来对左边数组进行递归调用快速排序
			quickSort(ary, left, pivot-1);
			// 根据中枢值(pivot),来对右边数组进行递归调用快速排序
			quickSort(ary, pivot+1, right);
		}
	}
	
	public static void main(String[] args) {
		int[] ary = {97, 58, 12, 88, 77, 33, 44, 66, 22};
		quickSort(ary, 0, ary.length-1);
		for(int i=0; i<ary.length; i++) {
			if(i!=ary.length-1)
				System.out.print(ary[i] + ", ");
			else
				System.out.println(ary[i]);
		}
	}
}


以上就是快速排序的完整算法了,互相学习吧。

更多精彩敬请关注公众号

Java极客思维

微信扫一扫,关注公众号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值