手撕Java快排

思想

从乱序的数字中找一个中位数(便于理解,就取最后一个数),设想两个游标,左游标指向第0个数,右游标指向最后一个数

第一步:左游标右移,直到找到一个数比中位数大的停止

第二步:右游标左移,直到找到一个数比中位数小的停止

第三步:交换左右游标的指向的数,这时候发生一个现象就是小的数在左移,大的数在右移

第四步:重复一二三步,直到左右游标指向同一个数。这时候交换中位数和同时指向的数。这时候发生一个现象就是左右游标同时指向的位置,左边全是比该位置对应的数小的数,右边全是比该位置对应的数大的数

第五步:以左右游标同时指向的位置分区,左区做一二三四重复操作,右区也做一二三四重复操作(说白了就是递归了)

实现

import java.util.Arrays;

/**
 * 快排
 *
 * @author zab
 * @date 2021-01-25 23:31
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] a = {1, 2, 5, 9, 4, 6, 7, 3, 8};

        quickSort(a, 0, a.length - 1);

    }

    private static void quickSort(int[] a, int start, int end) {
        if (a.length < 1) {
            return;
        }
        if (start >= end) {
            return;
        }

        int left = start;
        int right = end;
        int pivot = a[end];

        while (left < right) {
            //不断与左边比较,直到左边出现一个比pivot大的数停止
            while (left < right && a[left] <= pivot) {
                left++;
            }
            //不断与右边比较,直到右边出现一个比pivot小的数停止
            while (left < right && a[right] >= pivot) {
                right--;
            }
            //停止,交换左右下标数,保证左边都比pivot小,右边都比pivot大
            swap(a, left, right);
        }
        //遇到left 下标和right 下标重合了,交换重合点和pivot
        swap(a, left, end);
        System.out.println(Arrays.toString(a));
        //分区,左区都比pivot小,右区都比pivot大,递归调用
        quickSort(a, start, left - 1);
        quickSort(a, left + 1, end);
    }

    private static void swap(int[] a, int left, int right) {
        int temp = a[left];
        a[left] = a[right];
        a[right] = temp;
    }

}

 

posted @ 2021-01-25 23:45  陈旭园  阅读(26)  评论(0)    收藏  举报  来源