912. 排序数组(排序练手 )
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104
class MergeSort { public: vector<int> temp; MergeSort(int n) { temp = vector<int>(n,0); } void merge(vector<int>& nums, int low , int mid, int high ) { for(int i = low ; i <= high;i++) { temp[i] = nums[i]; } int i = low; int j = mid+1; for(int pp = low; pp <= high;pp++) { if (i<=mid && j <=high) { nums[pp] = temp[i] > temp[j]? temp[i++]: temp[j++]; } else if (i<=mid) { nums[pp] = temp[i++]; } else if (j<=high) { nums[pp] = temp[j++]; } } } //二叉树后续遍历,左边排好,右边排好,然后 merge void merge_sort(vector<int>& nums, int low, int high ) { if (low >= high) return; int mid = low + (high - low )/2; merge_sort(nums,low,mid); merge_sort(nums,mid+1,high); merge(nums,low,mid,high); } }; class QuickSort { public: int partation(vector<int>& nums, int low , int high ) { // 找到一个分界点,左边的小于 key, 右边的大于 key int key = nums[low]; int i = low+1; int j = high; while(i<=j) { if (nums[i] < key && key < nums[j]) { swap(nums[i++],nums[j--]); } if (nums[i]>=key) { i++; } if (key >=nums[j]) { j--; } } swap (nums[low],nums[j]); return j; } //二叉树前序遍历,先将 key 放到合适的位置,保证左边的小于 key, 右边的大于 key void quick_sort(vector<int>& nums, int low, int high ) { if (low >= high) return; int p = partation(nums,low,high); quick_sort(nums,low,p-1); quick_sort(nums,p+1,high); } }; class Solution { public: vector<int> sortArray(vector<int>& nums) { //MergeSort msort = MergeSort(nums.size()); //msort.merge_sort(nums,0,nums.size()-1); QuickSort qsort = QuickSort(); std::random_device rd; std::mt19937 g(rd()); std::shuffle(nums.begin(), nums.end(), g); qsort.quick_sort(nums,0,nums.size()-1); reverse(nums.begin(),nums.end()); return nums; } };