class Solution {
vector<int> array;
public:
void sortSubArray(vector<int>& nums,int left,int right){
if(right-left==1){
if(nums[left]>nums[right]){
int tmp;
tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
}
else{
int mid=(right+left)/2;
sortSubArray(nums,left,mid);
sortSubArray(nums,mid+1,right);
int i=left,j=mid+1;
array.clear();
while(i<=mid&&j<=right){
if(nums[i]<nums[j]){
array.push_back(nums[i]);
i++;
}
else{
array.push_back(nums[j]);
j++;
}
}
while(i<=mid){
array.push_back(nums[i]);
i++;
}
while(j<=right){
array.push_back(nums[j]);
j++;
}
for (int i = 0; i < right - left + 1; ++i) {
nums[i + left] = array[i];
}
}
}
vector<int> sortArray(vector<int>& nums) {
array.resize((int)nums.size(), 0);
sortSubArray(nums,0,nums.size()-1);
return nums;
}
};
看似正确但是却包含了两个重要的问题:
第一,sortSubArray采用了递归的方法却缺少了return函数
第二,对于left, mid,right的关系没有考虑清楚,对于left和right相等的情况,代码中没有相应的处理逻辑。
修改之后
class Solution {
vector<int> array;
public:
void sortSubArray(vector<int>& nums,int left,int right){
if(right>=left) return;
if((right-left)==1){
if(nums[left]>nums[right]){
int tmp;
tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
return;
}
//if(left>=right) return;
else{
int mid=(right+left)/2;
sortSubArray(nums,left,mid);
sortSubArray(nums,mid+1,right);
int i=left,j=mid+1;
array.clear();
while(i<=mid&&j<=right){
if(nums[i]<nums[j]){
array.push_back(nums[i]);
i++;
}
else{
array.push_back(nums[j]);
j++;
}
}
while(i<=mid){
array.push_back(nums[i]);
i++;
}
while(j<=right){
array.push_back(nums[j]);
j++;
}
for (int i = 0; i < right - left + 1; ++i) {
nums[i + left] = array[i];
}
}
}
vector<int> sortArray(vector<int>& nums) {
array.resize((int)nums.size(), 0);
sortSubArray(nums,0,nums.size()-1);
return nums;
}
};