题解 | #排序#
排序
https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
#include <vector> //归并排序 时间O(n log n) 空间O(n) 稳定 class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 将给定数组排序 * @param arr int整型vector 待排序的数组 * @return int整型vector */ void merge(vector<int>& nums,vector<int>& tmpArr,int left,int mid,int right){ //标记左半区第一个未排序的元素 int l_pos=left; //标记右半区第一个未排序的元素 int r_pos=mid+1; //临时数组元素下标 int pos=left; //合并 while(l_pos<=mid&&r_pos<=right){ if(nums[l_pos]<nums[r_pos]) tmpArr[pos++]=nums[l_pos++]; else tmpArr[pos++]=nums[r_pos++]; } //合并左半区剩余元素 while(l_pos<=mid){ tmpArr[pos++]=nums[l_pos++]; } //合并右半区剩余元素 while(r_pos<=right){ tmpArr[pos++]=nums[r_pos++]; } //把临时数组中的合并后的元素复制回原来的数组 while(left<=right){ nums[left]=tmpArr[left]; left++; } } void msort(vector<int>& nums,vector<int>& tmpArr,int left,int right){ if(left<right){//超过一个元素 则继续划分 //找中间点 int mid=(right-left)/2+left; //递归划分左半区 msort(nums,tmpArr,left,mid); //递归划分右半区 msort(nums,tmpArr,mid+1,right); //合并已划分的部分 merge(nums,tmpArr,left,mid,right); } } vector<int> MySort(vector<int>& arr) { // write code here vector<int> tmpArr(arr.size()); msort(arr,tmpArr,0,arr.size()-1); return arr; } };