快速排序

快排是一种非常重要的排序方法,必须掌握
首先引入荷兰国旗问题

这里只给出第一问的解题思路,大家可以思考下第二问
第一问:记录小于目标值的边界(起始为-1),从左到右遍历数组,如果小于等于目标值,与边界值下一个数交换位置,边界值++,如果大于目标值则continue

快速排序

O(N2)

 public static void main(String[] args) {
        int[] arr = new int[]{1,4,2,6,7,9,11,2,4,5};
        process(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));

    }


    public static  void  process(int[] arr,int start,int end){
        if(start>=end){
            return;
        }
        int birge=quicksort(arr, start,end);
        swap(arr,start+birge+1,end);
        process(arr,start,start+birge);
        process(arr,start+birge+2,end);

    }

    public static int quicksort(int[] arr,int start,int end){
        int brige=-1;
        for(int i=start;i<end;i++){
            if(arr[i]<=arr[end]){
                swap(arr,i,start+brige+1);
                brige++;
            }else{
                continue;
            }
        }
        return brige;

    }
    public static void swap(int[] arr,int i,int j){
         int mid=arr[i];
         arr[i]=arr[j];
         arr[j]=mid;
    }

一种比较复杂的排序方法,其思路与上面的荷兰国旗的问题类似

我们要找出当前数组最后一个元素的目标位置(即它左边的数都要小于等于它,它右边的数都要大于它),与该位置交换

我们再以该数为界限,把他左边 看成一个新的数组,右边也看成一个新的数组,调用上述方法

posted @ 2021-04-01 12:30  刚刚好。  阅读(49)  评论(0编辑  收藏  举报