排序算法-快速排序

package partition;

import java.util.Arrays;

public class Test1 {
    public static void main(String[] args) {
        int[] numbers={1,2,3,4,5,6,0,7,8,9,10,0};
        partitionSort(numbers,0,numbers.length-1);
//        for (int n:numbers) {
//            System.out.println(n);
//        }
    }

    private static void partitionSort(int[] numbers,int left,int right) {
        if (left>=right){
            return;
        }
        int mid = partition(numbers, left, right);
        partitionSort(numbers,left,mid-1);
        partitionSort(numbers,mid+1,right);
    }

    static int partition(int[] s,int left ,int right){
        int pivot=s[right];
        int i=left;
        int j=left;
        while (i<right&&j<right){
            if (s[i]>s[j]&&s[j]<pivot){
                int temp=s[j];
                s[j]=s[i];
                s[i]=temp;
                j++;
                i++;
                continue;
            }
            if (s[i]<pivot&&s[i]<s[j]){
                i++;
            }
            j++;
        }
        if (s[i]>pivot){
            int tempt=s[i];
            s[i]=pivot;
            s[right]=tempt;
        }

        System.out.println(Arrays.toString(s));
        return i;
    }
}

无参考的,代码比较臃肿。使用类似归并排序的树形递归结构,很容易打出来,这个代码哨兵花费大量时间去调试,关于哨兵,记住一个重点
i索引递增的两种情况,
第一种情况:s[i]>s[j]并且s[j]<pivot的值,i索引+1
第二种情况:s[i]小于pivot并且s[i]小于s[j]。
还有就是s[i]和pivot的交换条件 s[i]必须大于pivot的值,交换才有意义,否则会有问题

上一篇:剑指 Offer 11. 旋转数组的最小数字


下一篇:快速排序(lomuto 和 Hoare)