快速排序实现(Java版)

快排原理

  1. 先从数列中取出一个数作为基准数

  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

  3. 再对左右区间重复第二步,直到各区间只有一个数

另外分享一个神一样的网站:
visualgo算法可视化。

基本上所有的算法它都能用可视化的方法直观的展示出来。

另外本文的思路来源于:
白话经典算法系列之六 快速排序 快速搞定

按这位大佬的说法快排无非是:

挖坑填数+分治法

但是!但是!在CSDN上找到了三种实现快排的博文

快速排序(三种算法实现和非递归实现)

这里我分享最简单的一种:也就是目前的愚钝脑子能理解的一种。

左右指针法

  1. 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里我采用序列的第一个数为枢轴。(原作者采用最后一个)
  2. 设置两个变量left = 0;right = N - 1;
  3. 从left一直向后走,直到找到一个大于key的值,right从后至前,直至找到一个小于key的值,然后交换这两个数。
  4. 重复第三步,一直往后找,直到left和right相遇,这时将key放置left的位置即可。
/**
	 * 快速排序
	 * @param array
	 * @param left
	 * @param right
	 */
	public static void quickSort(int[] array, int left, int right) {

		if (left >= right)
		{
			return;
		}//区间只有一个数 停止递归
		int index = PartSort(array, left, right);//枢轴的位置
		// index 的位置已经排好了
		quickSort(array, left, index - 1);
		quickSort(array, index + 1, right);
	}

	public static int PartSort(int[] array,int left,int right)
	{
		int key = left;//每次取区间中最左的数作为基准数
		//两个标尺,表示left左边的数都比它小 ,right 右边的数都比它大
		while(left < right)
		{
			//终止循环的两个条件
			//1.left==right 表示整个循环中 直到 index = left = right
			//都遵循 index 左边 比 key 小 ,index 右边 比 key
			//至于 index 当然 <= key 啊 因为 限制性 ++ left 啊
			//终止条件2
			// left 比 key 大,说明需要交换,停止循环
			while(left < right && array[left] <= array[key])
			{
				++left;
			}
			//与上面的同理
			while(left < right && array[right] >= array[key])
			{
				--right;
			}
			//交换
			Tools.swap(array,left,right);//自己写的交换函数
		}
		//交换 index 和 key 已经说明清楚了 key 比 index 大 见上面解释
		Tools.swap(array,left,key);
		return left;
	}

对了原文是C++版,我改写成了Java版。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值