1. 程式人生 > 其它 >演算法學習100天——5 快速排序1

演算法學習100天——5 快速排序1

題目地址(75. 顏色分類)

https://leetcode-cn.com/problems/sort-colors/

題目描述

給定一個包含紅色、白色和藍色、共 n 個元素的陣列 nums ,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

必須在不使用庫的sort函式的情況下解決這個問題。

示例 1:
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]

示例 2:
輸入:nums = [2,0,1]
輸出:[0,1,2]

提示:
n == nums.length
1 <= n <= 300
nums[i] 為 0、1 或 2

進階:
你可以不使用程式碼庫中的排序函式來解決這道題嗎?
你能想出一個僅使用常數空間的一趟掃描演算法嗎?

程式碼

Java Code:

class Solution {
    /**
     * 思路:這個題類似於快排演算法,將大於1得數往右挪動,小於1得數往左挪
     *
     * 這個題和快速排序的區別在於:
     * 快排只需要把數分為兩類,大於等於n + 小於n(或小於等於n + 大於n),而這個題需要分為三類,小於n + 等於n + 大於n
     *
     * 本題中,對於三種數的處理方式:
     * 1.小於,將這個數挪到小於區域(即 將小於區域指標指向的數與nums[i]交換),再i++,因為新換過來的數以及比較過,可以確定比n小;
     * 2.等於,直接跳過,即i++;
     * 3.大於,將這個數挪到大於區域(即 將大於區域指標指向的數與nums[i]交換),i不動,因為這個新換過來的數還沒有判斷過.
     */
    public void sortColors(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int n = 1;
        int i = 0;
        while(i <= right){
            if(nums[i] < n){
                swap(nums, left++, i++);
            }else if(nums[i] == n){
                i++;
            }else{
                swap(nums, i, right--);
            }
        }
    }
    private void swap(int[] nums, int a, int b){
        int t = nums[a] ^ nums[b];
        nums[a] = t ^ nums[a];
        nums[b] = t ^ nums[b];
    }
}

執行結果

執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的使用者

記憶體消耗:39.8 MB, 在所有 Java 提交中擊敗了19.49%的使用者

本文來自部落格園,作者:ergwang,轉載請註明原文連結:https://www.cnblogs.com/ergwang/p/15952610.html