个人拙见理解使用Java进行快速排序

看其他人写博客的快速排序,总是交换来交换去的,不能很容易理解,个人从另一个角度理解快速排序。

快速排序事实上就选一数为中间轴,比它小的在前面,大的在后面,比如一组数据48、37、64、96、75、12、26

就是将37,12,26放在48前面,64,96,75放在后面,即第一个交换结果为37、12、26、48、64、96、75

当然数据序列可能有些偏差,下面说一下思路

    public static int partition(int array[], int low, int high) {
        //当前位置为第一个元素所在位置
        int p_pos = low;
        //采用第一个元素为轴
        int pivot = array[p_pos];
        for (int i = low + 1; i <= high; i++) {
            if (array[i] < pivot) {            
                p_pos++;
                swap(array, p_pos, i);
                System.out.println(Arrays.toString(array));
            }
        }
        swap(array, low, p_pos);
        System.out.println(Arrays.toString(array));
        return p_pos;
    }

相当于{48,37,64,96,75,12,26}为当前数组,重新创建一个新数组{48,空,空……},中间轴数pos就是固定的48

先拿37和48进行比较,小于且等于(<=),37放在第二个空即为{48,37,空……},事实上代码是将37和第二个位置数进行交换,也就是37和37交换

遍历之后12小于且等于(<=)48,置换第三个空,也就是12和46交换

同理26和96交换,最后变为48, 37, 12, 26, 75, 64, 96,

遍历完后,再将第一个数和中间轴数pos交换,变为26, 37, 12, 48, 75, 64, 96

为什么不先把48和pos=48比较,因为比较后48会一直改变

只要将后面6个数划分两个块,48和较小的块最后一个数交换即可

当然只用到了一个判定只是为了方便理解,在算法设计上并不是从前往后遍历的,

public static int partition(int array[], int low, int high) {
        //当前位置为第一个元素所在位置
        int p_pos = low;
        //采用第一个元素为轴
        int pivot = array[p_pos];
        int i=low,j=high;
        while(i < j){
            while(array[j] > pivot)
                j--;
            swap(array, i, j);
            while(array[i] < pivot)
                i++;
            swap(array, i, j);
        }
        System.out.println(Arrays.toString(array));
        return i;
    }

而是先左边再右边,右边再左边

原文地址:https://www.cnblogs.com/zhengyuanyuan/p/9037462.html