荷兰国旗问题(快速排序初步思想)

问题描述:

给定一个整数数组,给定一个值K,这个值在原数组中一定存在,要求把数组中小于K的元素放到数组的左边,大于K的元素放到数组的右边,等于K的元素放到数组的中间,最终返回一个整数数组。

例如:
给定数组
[2, 3, 1, 4, 7, 6, 5, 10, 9],给定一个值9,
那么经过处理后结果数组是:
[2, 3, 1 ,4, 7, 6, 5, 9, 10 ]

代码:



/**
 * @description:荷兰国旗问题 任给一个数为划分值,小于它的放在他的前面,等于它的放在中间,大于他的放在他的后面。 分成三部分
 * @Author MRyan
 * @Date 2020/5/12 9:31
 * asi
 */
public class Dutchflag {
    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 4, 7, 6, 5, 10, 9};
        int target = 9;
        int[] solve = solve(nums, 0, nums.length - 1, target);
        for (int i : solve) {
            System.out.print(i + " ");
        }
        System.out.println();
        for (int i : nums) {
            System.out.print(i + " ");
        }
    }


    /**
     * @param nums
     * @param l
     * @param r
     * @param target
     * @return 大于区小于区左右边界的位置
     */
    public static int[] solve(int[] nums, int l, int r, int target) {
        //  )2 3 1 5 7 6 5 4 5(
        //小于区边界 初始化任何元素都不放在小于区
        int left = l - 1;
        //大于区边界  初始化任何元素都不放在大于区
        int right = r + 1;
        //当前值索引超过大于区边界退出结束
        while (l < right) {
            //当前值nums[l] 等于 划分值
            if (nums[l] == target) {
                //当前值位置后移
                l++;
            }
            //当前值nums[l] 小于 划分值
            else if (nums[l] < target) {
                //小于区下一个元素和当前值交换 并且 小于区边界后移  当前值位置后移
                swap(nums, ++left, l++);
            }
            //当前值nums[l] 大于 划分值
            else if (nums[l] > target) {
                //大于区前一个元素和当前值交换 并且 大于区边界前移  下次循环继续比较当前值和划分值大小
                swap(nums, --right, l);
            }
        }
        return new int[]{left + 1, right};
    }

    public static void swap(int[] nums, int l, int r) {
        int temp = nums[l];
        nums[l] = nums[r];
        nums[r] = temp;
    }
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章