快速排序算法(20200227)

题目描述

今天来用Java实现一下快速排序算法,首先了解一下快速排序

基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法解析
1、选择一个基准元素,通常选择第一个元素或者最后一个元素
2、通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值均比基准值大
3、通过一趟排序,基准元素就在其排好序后的正确位置上了
4、然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序
PS:下述动图引用自网上,侵删!

然后来了解一下递归方法的使用
1、递归算法有一个出口
2、递归时候每次做的事情都一样
举个典型的例子:n!=n*(n-1)!,出口是1!=1,每次递归都调用(n-1)!

题解:

public class quickSort {
	/**
	 * 快排算法(以数组中最后一个值作为基准)
	 */
	public static int[] algo(int[] arr, int low, int high) {
		//定义四个指针,low和high用来做目前快排数组中哪部分数的标记,left和right用来做目前与基准值比较的元素的定位
		int left = low;
		int right = high;
		//只要left和right两个指针没有相遇,就说明一轮比较没有完成
		while (left < right) {
			//基准值为最右侧元素
			int base = arr[right];
			//从最左侧元素开始与基准值做比较
			while (left < right) {
				//若左侧元素比基准值小,指针向右移一步,表示进行下一个元素的比较
				if (arr[left] <= base) {
					left += 1;
				} else {
					//若左侧元素比基准值大,该元素与基准值进行交换,然后右指针向左移一步,同时退出该左侧元素比较的循环,进入右侧元素比较
					arr[right] = arr[left];
					arr[left] = base;
					right -= 1;
					break;
				}
			}
			//右侧比较原理同上,不再做赘述
			while (left < right) {
				if (arr[right] >= base) {
					right -= 1;
				} else {
					arr[left] = arr[right];
					arr[right] = base;
					left += 1;
					break;
				}
			}
			//通过一趟排序正确放置好基准元素的位置,左侧元素值均比基准元素值小,右侧元素值均比基准值大
			//对左侧序列进行快排
			algo(arr, low, left - 1);
			//对右侧序列进行快排
			algo(arr, right + 1, high);
		}
		return arr;
	}

	public static void main(String[] args) {
		int[] nums = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
		int[] result = algo(nums, 0, nums.length-1);
		for (int i : result) {
			System.out.print(i+" ");
		}
	}
}

说明:
目前本King的代码能力只能按上述方式实现,后续有更好的方案,欢迎各位指点,也会不定期做修改~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值