单指针快排和双指针快排,Java实现,附详细推导步骤

*我是一个从汽车行业转行IT的项目经理,我是Edward,如想了解更多,请关注我的公众号【转行项目经理的逆袭之路】。今天想跟大家聊聊快排,快速排序是我很早就很感兴趣的一种排序,时空复杂度低,递归,有代表性,但是代码相对复杂,理解起来不那么容易,最常见的两种算法是单轴和双轴,各有优缺点,不过万变不离其宗。
经过进一步的研究分析后,对之前的分类进行一下修改,本文提到的两种都只能算是单轴 ,一种是单指针,一种是双指针。至于真正Arrays.sort里用到的双轴快排,是非常复杂的,以后会分享对源码的分析。 *

单指针快排

package algorithm;


import java.util.Arrays;
/**
 * single pointer quick sort    right
* @author EP
* @date 2020年4月11日  
* @version 1.0
 */
public class QuickSort_Single {
   
	public static void sort(int[] arr) {
   
	    sort(arr, 0,arr.length - 1);
	}

	private static void sort(int[] arr, int startIndex, int endIndex) {
   
	    if (endIndex <= startIndex) {
   
	        return;
	    }
	    //切分
	    int pivotIndex = partition(arr, startIndex, endIndex);
	    sort(arr, startIndex, pivotIndex-1);      //递归
	    sort(arr, pivotIndex+1, endIndex);
	}

	private static int partition(int[] arr, int startIndex, int endIndex) {
   
	    int pivot = arr[startIndex];//取基准值
	    int mark = startIndex;//mark初始化为起始下标

	    for(int i=startIndex+1; i<=endIndex; i++){
      //单边扫描
	        if(arr[i]<pivot){
   
	            //小于基准值 则mark+1,并交换位置。   大于基准值 则没有操作。
	            mark ++;
	            int p = arr[mark];
	            arr[mark] = arr[i];
	            arr[i] = p;
	        }
	    }
	    //基准值与mark对应元素调换位置
	    arr[startIndex] = arr[mark];
	    arr[mark] = pivot;
	    return mark;
	}
    public static void main(String args[]) {
   
        int[] arr = {
   3, 5, 1, 7, 2, 9, 8
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值