题目
思路 快速排序
选取基准元,先把小于它的放到左边,大于它的放到右边,再分别排序左边部分和右边部分。
代码
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
quickSort(nums, 0, nums.size() - 1);
return nums;
}
void quickSort(vector<int>& nums, int l, int r){
if(l >= r) return;
int pivot = partition(nums, l, r);
quickSort(nums, l, pivot - 1);
quickSort(nums, pivot + 1, r);
}
int partition(vector<int>& nums, int l, int r){
int pos = rand() % (r - l + 1) + l; //随机选取
swap(nums[pos], nums[l]);
int pivot = nums[l], ans = l + 1;
for(int i = l + 1; i <= r; i++){
if(nums[i] < pivot)
swap(nums[i], nums[ans++]);
}
swap(nums[l], nums[--ans]);
return ans;
}
};
思路 归并排序
把数组分为两部分,分别排序,排序完后再合并。
代码
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
mergeSort(nums, 0, nums.size() - 1);
return nums;
}
void mergeSort(vector<int>& nums, int l, int r){
if(l >= r) return;
int mid = l + r >> 1;
mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);
vector<int> tmp(r - l + 1, 0);
int i = l, j = mid + 1, cnt = 0;
while(i <= mid && j <= r){
if(nums[i] <= nums[j])
tmp[cnt++] = nums[i++];
else
tmp[cnt++] = nums[j++];
}
while(i <= mid){
tmp[cnt++] = nums[i++];
}
while(j <= r){
tmp[cnt++] = nums[j++];
}
for(int i = 0; i < r - l + 1; i++){
nums[l + i] = tmp[i];
}
}
};