912. Sort an Array

數值範圍不大的話,可以直接 counting sort!

Heap sort 跟 merge sort 之後補上。

AC Code (quick sort 60ms)

把 pivot 當作分水嶺,in-place 的把 $\leq$ pivot 的數字搬到左邊, $\gt$ 的搬到右邊。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
private:
    void qSort(int lb, int rb, vector<int> &nums) { // [lb, rb)
        int n = rb - lb;
        
        // terminating condition
        if(n <= 1) {
            return;
        }
        
        int pivot = lb + rand() % n;
        swap(nums[rb - 1], nums[pivot]); // pivot init at rb - 1
        pivot = rb - 1; // lol, don't forget
        
        int i = lb;
        while(i != pivot) { 
            if(i < pivot) {
                if(nums[i] <= nums[pivot]) {
                    i++;
                } else {
                    swap(nums[i], nums[pivot]);
                    swap(pivot, i);
                    i--;
                }
            } else {
                if(nums[pivot] > nums[i]) {
                    swap(nums[i], nums[pivot]);
                    swap(pivot, i);
                    i++;
                } else {
                    i--;
                }
            }
        }

        qSort(lb, i, nums);
        qSort(i + 1, rb, nums);
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        qSort(0, nums.size(), nums);
        
        return nums;
    }
};

AC code (quick sort 472ms)

直觀的實作,有很多 vector 的操作,所以比較慢。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        // straight forward implementation of quick sort
        int n = nums.size();
        
        // terminating condition
        if(n <= 1) {
            return nums;
        }
        
        int pivot = rand() % n;
        vector<int> left, right;
        for(int i = 0; i < n; i++) {
            if(i != pivot) {
                if(nums[i] <= nums[pivot]) {
                    left.push_back(nums[i]);
                } else {
                    right.push_back(nums[i]);
                }
            }
        }
        
        left = sortArray(left);
        right = sortArray(right);
        
        vector<int> ret(left);
        ret.push_back(nums[pivot]);
        ret.insert(ret.end(), right.begin(), right.end());
        
        return ret;
    }
};