快速排序算法实现

如果数组中没有重复元素,可以用此代码快速实现

排序数组

    public static int[] quickSort(int[] arr) {
        if (arr.length == 0 || null == arr) {
            return arr;
        }

        quickSort(arr, 0, arr.length - 1);
        return arr;
    }

找到枢轴元素下标,然后按下标分割数组,递归排序

    private static void quickSort(int[] arr, int low, int high) {
        if (low >= high) {
            //递归退出条件
            return;
        }
        int pivotIndex = partition(arr, low, high);
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }

分割算法

    private static int partition(int[] arr, int low, int high) {
        int pivotEle = getPivot(arr, low, high);

        int i = low;
        int j = high;

        for (; ; ) {
            while (arr[i] < pivotEle) {
                i++;//比 pivot 元素小,则直接往后移一位
            }
            while (arr[j] > pivotEle) {
                j--;//比 pivot 元素大,则直接后前移一位
            }

            if (i < j) {
                swap(arr, i, j);//找到:arr[i] 比 pivot 元素大,arr[j] 比 pivot 元素小,swap 
            } else {
                break;
            }
        }
        return i;//pivot 元素对应的 index,在这一轮排序中已经固定不变。
    }

选取枢轴元素算法,按理说是选的元素越偏“中间”越好,这里直接选“最后”一个元素

    private static int getPivot(int[] arr, int low, int high) {
        return arr[high];
    }

元素交换

    private static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
posted @ 2024-03-15 00:08  大熊猫同学  阅读(9)  评论(0编辑  收藏  举报