力扣 541. 反转字符串 II(简单)

JVM内存结构

  返回  

数据结构与算法:快速排序

2021/8/20 11:14:05 浏览:

一、原理

对于任意一个无序数组,我们随机的选一个元素作为基准元素(例如:数组中的最后一个或者第一个元素, 然后我们将数组中的剩余元素分别与基准元素进行比较,将小于或等于基准元素的数据放在基准元素的左边,将大于基准元素的数据放在基准元素的右边,当全部比较完成之后,基准元素在数组中的位置就确定了下来。然后,在分别对左边数组和右边的数组递归的进行上面的操作,直到每一个元素的位置都唯一确定下来。

注意:快速排序最难理解的地方是如何将小于基准元素的元素放在左边,将大于基准元素的元素放在右边,本示例代码使用双指针方法

二、示例代码

public class QuickSort {
    /**
     * 获取
     *
     * @param nums
     * @param mark  基准元素
     * @param start 数组开始下标位置
     * @param end   数组结束下标位置
     * @return 基准元素最终下标位置
     */
    public static int getPartIndex(int[] nums, int mark, int start, int end) {
        int j = start;
        for (int i = start; i <= end; i++) {
            if (nums[i] <= mark) {
                swap(nums, i, j);
                j++;
            }
        }

        return j - 1;
    }

    /**
     * 交换相应位置数据
     *
     * @param nums
     * @param i
     * @param j
     */
    public static void swap(int[] nums, int i, int j) {
        int swap = nums[i];
        nums[i] = nums[j];
        nums[j] = swap;
    }

    /**
     * 递归对不同partition排序
     *
     * @param nums
     * @param mark 基准元素
     * @param start
     * @param end
     */
    public static void partRecursion(int[] nums, int mark, int start, int end) {
        //递归结束条件
        if (start == end)
            return;
        int partIndex = getPartIndex(nums, mark, start, end);
        if (partIndex == start) {
            partRecursion(nums, nums[end], partIndex + 1, end);
        } else if (partIndex == end) {
            partRecursion(nums, nums[partIndex - 1], start, partIndex - 1);
        } else {
            partRecursion(nums, nums[partIndex - 1], start, partIndex - 1);
            partRecursion(nums, nums[end], partIndex + 1, end);
        }
    }

    public static void main(String[] args) {
        int[] nums = {5, 1, 1, 2, 0, 0, 9, 6};
        int end = nums.length - 1;
        partRecursion(nums, nums[end], 0, end);
        String outStr = "";
        for (int i : nums) {
            outStr = outStr + "," + String.valueOf(i);
        }
        System.out.println(outStr);
    }
}
0 0 1 1 2 5 6 9

三、参考文章

快速排序算法–Java实现

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号