荷蘭國旗問題(快速排序初步思想)

問題描述:

給定一個整數數組,給定一個值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;
    }
}





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