iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

題目說明:給一個陣列,陣列中數字0代表紅色、數字1代表白色、數字2代表藍色,要依照數字的大小(也就是顏色要依照紅白藍的規則)進行排序,並且排序要就地(in place)排序且不能使用程式語言中的函示庫

Case 1:
Input: nums = [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Case 2:
Input: nums = [2,0,1]
Output: [0,1,2]

解題思路:原本的題目敘述落落長,其實就是要你排序而已。排序有非常多種方式,這次解題時都是比較簡單的排序方式。以下會逐一介紹常見的三種排序方式
1.Bubble sort
運用陣列中相鄰元素之間兩兩交換的方式進行排序,這樣講可能有些抽象,我們直接舉一個例子來說明:
有一個矩陣{5,1,4,2,8}
1st iteration:
(1)從頭開始(第0個),5>1,兩個交換,於是陣列變成了{1,5,4,2,8}
(2)由於5又>4,因此再次交換,陣列變成了{1,4,5,2,8}
(3)5>2,再次交換,陣列變成了{1,4,2,5,8}
(4)因為5<8,不用交換,陣列維持不變,{1,4,2,5,8}

2nd iteration
(1)從矩陣的第一個開始(4),4>2,交換,陣列變成{1,2,4,5,8},由於已經從小排到大,結束排序

時間複雜度:O(n^2),當資料很大時不適合使用,因為不斷地交換十分耗時

Pseudo code

bubbleSort(array){
for(int i=0;i<array.length;i++){
    for(int j=i+1;j<array.length-i;j++){
        if(array[j]<array[i]){
            swap(array[j],array[i])
        }
    }
}
}

附上一張gif來幫助了解bubble sort的機制

2.Selection sort
重複在尚未排序的數列當中找到最小值並進行交換,同樣以{5,1,4,2,8}為例
1st iteration
從頭(5)開始,剛好剩下四個最小的就是在5旁邊的1,直接進行交換,陣列變成{1,5,4,2,8}

2nd iteration
從陣列的第一個(5)開始,剩下三個中最小的是2,進行交換後陣列變成{1,2,4,5,8},已經由小排到大,無需排序

Pseudo code

selectionSort(array){
    for(int i=0;i<array.length;i++){
        min=i
        for(int j=i+1;j<array.length;j++){
            if(array[min]>array[j]){
                min=j
            }
        }
        if(min!=i){
            swap(array[min],array[i])
        }
    }
}

時間複雜度:O(n^2)

同樣附上一張gif幫助理解

3.insertion sort
就跟我們打牌很像,將拿到的新牌插入到已經排序好的牌組。同樣以{5,1,4,2,8}為例
1st iteration
5

2nd iteration
1<5,因此插入到5前面,變成{1,5}

3rd iteration
4要插入到{1,5}的陣列裡面,變成{1,4,5}

4th iteration
2要插入到{1,4,5}的陣列裡面,變成{1,2,4,5}

5th iteration
8要插入到{1,2,4,5}的陣列裡面,變成{1,2,4,5,8}

Pseudo code

insertionSort(array){
    for(int i=1;i<array.length;i++){
        x=array[i]
        j=i-1
        while (j>=0&&array[j]>x){
            array[j+1]=array[j]
            j-=1
        }
        array[j+1]=x
    }
}

時間複雜度:O(n^2)

同樣附上一張gif幫助理解

這題可以從這三種隨便挑一個進行排序即可,附上程式碼

Java

class Solution {
    public void sortColors(int[] nums) {
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){
                    int temp=nums[j];
                    nums[j]=nums[i];
                    nums[i]=temp;
                }
            }
        }
    }
}//使用bubble sort

Python

class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(len(nums)):
            min_idx = i
            for j in range(i+1, len(nums)):
                if nums[j] < nums[min_idx]:
                    min_idx = j
            if min_idx != i:
                nums[i], nums[min_idx] = nums[min_idx], nums[i]
        #使用selection sort

上一篇
Day 12 Valid Palindrome
下一篇
Day 14 Invert Binary Tree
系列文
從leetcode學習資料結構和演算法31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言