partition分区(左小右大)

  • 单指针扫描:p1扫描数组,p2指向数组尾部,p1扫描到比pivot小的数则与p2元素交换,p2左移

    public static int partition1(int[] arr, int left, int right) {
        int p1 = left + 1;
        int p2 = right;
        int pivot = arr[left];
        while(p1 <= p2) {
            if(arr[p1] >= pivot) {
                Util.swap(arr,p1,p2);
                p2--;
            } else p1++;
        }
        Util.swap(arr,left,p2);
        return p2;
    }
    
  • 双指针扫描:p1从左往右扫描到大的元素停下,p2从右往左扫描到小的元素停下,p1、p2同时停下后交换p1和p2指向的元素

    public static int partition2(int[] arr, int left, int right) {
    	int p1 = left + 1;
    	int p2 = right;
        int pivot = arr[left];
        while(p1 <= p2) {
            while(p1 <= p2 && arr[p1] <= pivot) p1++;
            while(p1 <= p2 && arr[p2] > pivot) p2--;
            if(p1 <= p2) Util.swap(arr,p1,p2);
        }
        Util.swap(arr,left,p2);
        return p2;
    }
    
  • 双指针扫描和一个判等指针:三个while循环,(p1从左往右扫描,遇到等于或者大于pivot的数停下),(当p1扫描到等于pivot的数时,equal指针移动到p1处,p1右移后停下),(p2从右往左扫描遇到小于pivot的数停下)

    public static int partition3(int[] arr, int left, int right) {
         int p1 = left + 1;
         int p2 = right;
         int equal = left + 1;
         int pivot = arr[left];
    
         while(p1 <= p2) {
             while(p1 <= p2 && arr[p1] < pivot) p1++;
             while(p1 <= p2 && arr[p2] >= pivot) p2--;
             while(p1 <= p2 && arr[p1] == pivot) {
                 equal = p1;
                 p1++;
             }
             //如果p1因为遇到大数且和p2同时停下
             if(p1 <= p2 && arr[p1] > pivot && arr[p2] < pivot)
                 Util.swap(arr,p1,p2);
                 //如果p1因为遇到等于pivot的数右移后停下
             else if(p1 <= p2 && arr[equal] < arr[p1])
                 Util.swap(arr,equal,p1);
         }
         Util.swap(arr,left,p2);
         return p2;
     }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值