Partition函数

快排中核心的方法应该算是Partition函数了,它的作用就是将整个数组分成小于基准值的左边,和大于基准值的右边。

普通的Partition函数是这样的:

public static int partition1(int[] array,int lo,int hi){
        //以第一个值为基准值,当然你也可以3取1,
        int key=array[lo];
        while(lo<hi){
            while(array[hi]>key&&hi>lo){//从后半部分向前扫描
                hi--;
            }
            array[lo]=array[hi];
            while(array[lo]<=key&&hi>lo){//从前半部分向后扫描
                lo++;
            }
            array[hi]=array[lo];
        }
        array[hi]=key;
        return hi;
    }

public static void main(String[] args) {
        int[] a = {34,2,25,1,12,34,12,56,23,15,34,67,89,54,34};
        partition2(a, 0, 14);
        for(int i=0; i<a.length; i++) {
            System.err.print(a[i]+" ");
        }
    }
打印的结果是:
34 2 25 1 12 34 12 34 23 15 **34** 67 89 54 56 

看出来没,大家都是相同的基准值34是各自分开的,我们希望得结果应该是这样的:
25 1 12 12 23 15 34 34 34 34 89 54 67 56 
这样的好处是相同的值,在后续的遍历过程中,不用再比较一次了。

(左程云,左神写的)
牛逼的Partition函数是这样的:

public static int[] partition1(int[] arr, int begin, int end, int pivotValue) {
        int small = begin - 1;
        int cur = begin;
        int big = end + 1;
        while (cur != big) {
            if (arr[cur] < pivotValue) {
                swap(arr, ++small, cur++);
            } else if (arr[cur] > pivotValue) {
                swap(arr, cur, --big);
            } else {
                cur++;
            }
        }
        int[] range = new int[2];
        range[0] = small + 1;
        range[1] = big - 1;
        return range;
    }

public static void main(String[] args) {
        int[] a = {34,2,25,1,12,34,12,56,23,15,34,67,89,54,34};
        int[] b = partition1(a,0,14,34);
        System.out.println(b[0]);
        System.out.println(b[1]);
        for(int i=0; i<a.length; i++) {
            System.err.print(a[i]+" ");
        }
    }
输出的结果是:
7 //相同基准值的起始索引
10 //相同基准值的末尾索引
2 25 1 12 12 23 15 **34 34 34 34** 89 54 67 56 

这样,你下一次递归直接就可以避免重复比较相同的基准值了。
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
PARTITION函数是一个用于将数组分成三个部分的函数。它的作用是根据一个基准值,将数组中小于基准值的元素放在左边部分,等于基准值的元素放在中间部分,大于基准值的元素放在右边部分。\[1\]在具体实现中,PARTITION函数使用了三个指针:left、index和right。left表示左部分的右边界,index表示中部分右边界的右边,right表示右部分的左边界。\[3\] 在遍历数组的过程中,如果当前元素小于基准值,就将它与left右边的元素交换,并将left和index都向右移动一位。如果当前元素等于基准值,就将index向右移动一位。如果当前元素大于基准值,就将它与right左边的元素交换,但由于right左边和index右边是模糊区域,所以index不变。然后将right向左移动一位。\[3\] 通过这样的遍历过程,最终数组会被分成三个部分,左部分是小于基准值的元素,中部分是等于基准值的元素,右部分是大于基准值的元素。最后,PARTITION函数会返回中部分的右边界,即中部分和右部分的分界点。\[2\] #### 引用[.reference_title] - *1* *3* [partition函数](https://blog.csdn.net/metheir/article/details/53983331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基本算法-partition函数](https://blog.csdn.net/zhouyufei0001/article/details/52551501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值