1. 程式人生 > 其它 >快排、歸併和堆排

快排、歸併和堆排

原題:https://leetcode-cn.com/problems/sort-an-array/

快排主要是先找一個隨機數l作為換的標杆,比他大的放後面,比他小的放前面,為了方便找到位置,將它交換到區間最前面。然後從右邊找到比它小的j,左邊找到比它的大的i(先找j後i,否則當nums[left]最小時,i會一直找到最後一個right,但是nums[right]仍然小於nums[left],但是按照我們的程式碼就會將他們交換,但是反過來先找j不會,因為出現類似的情況j會到達left的位置,而交換left和left是不會有影響的)交換它們直到i和j碰到,然後將該值與left交換(因為當i==j時,i和前面都是小於或者就是nums[left]的,後面都是大於的)。

class Solution {
public:
    void quick_sort(vector<int>& nums, int left, int right){
        if(left >= right) return;
        int l = rand() % (right - left + 1) + left; 
        swap(nums[left], nums[l]);
        int i = left, j = right;
        while(i < j){
            while(i < j && nums[j] >= nums[left]) j--;
            
while(i < j && nums[i] <= nums[left]) i++; swap(nums[i], nums[j]); } swap(nums[left], nums[i]); // for(auto item: nums) // cout << item << " "; // cout << i << endl; quick_sort(nums, left, i - 1); quick_sort(nums, i
+ 1, right); } void merge_sort(vector<int>& nums, int left, int right){ if(left >= right) return; int mid = (left + right) / 2, i = left, j = mid + 1, cnt = 0; merge_sort(nums, left, mid); merge_sort(nums, mid + 1, right); vector<int> v; while(i <= mid && j <= right){ if(nums[i] < nums[j]) v.push_back(nums[i++]); else v.push_back(nums[j++]); } while(i <= mid) v.push_back(nums[i++]); while(j <= right) v.push_back(nums[j++]); for(int k = left; k <= right; k++){ nums[k] = v[k - left]; } } void downJust(vector<int>& nums, int x){ int i = 1, j = 2; while(j <= x){ if(j + 1 <= x && nums[j] > nums[j - 1]) j++; if(nums[i - 1] < nums[j - 1]) { swap(nums[i - 1], nums[j - 1]); i = j; j *= 2; } else break; } } void upJust(vector<int>& nums, int x){ int i = x + 1, j = (x + 1) / 2; while(j){ if(nums[i - 1] > nums[j - 1]) { swap(nums[i - 1], nums[j - 1]); i = j; j /= 2; } else break; } } void heap_sort(vector<int>& nums, int left, int right){ for(int i = 0; i < nums.size(); i++){ upJust(nums, i); } for(int i = nums.size() - 1; i > 0; i--){ swap(nums.front(), nums[i]); downJust(nums, i); } } vector<int> sortArray(vector<int>& nums) { quick_sort(nums, 0, nums.size() - 1); // heap_sort(nums, 0, nums.size() - 1); return nums; } };