1. 归并排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
mergeSort(nums, 0, (int) nums.size() - 1);
return nums;
}
void mergeSort(vector<int>&nums, int start, int end) {
if(start >= end) return;
int mid = start + (end - start) / 2;
mergeSort(nums, start, mid);
mergeSort(nums, mid + 1, end);
return merge(nums, start, mid, end);
}
void merge(vector<int>& nums, int start, int mid, int end) {
vector<int> tmp(end - start + 1);
int i = start, j = mid + 1, k = 0;
while( i <= mid && j <= end){
if(nums[i] < nums[j]) tmp[k++] = nums[i++];
else tmp[k++] = nums[j++];
}
while(i <= mid) tmp[k++] = nums[i++];
while(j <= end) tmp[k++] = nums[j++];
for(int idx = start; idx <= end; idx++) {
nums[idx] = tmp[idx - start];
}
}
};
2. 快速排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
quickSort(nums, 0, (int) nums.size() - 1);
return nums;
}
void quickSort(vector<int>& nums, int left, int right) {
if(left > right) return;
int j = partition(nums, left, right);
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
int partition(vector<int>& nums, int left, int right) {
int i = left + 1;
int j = right;
int pivot = nums[left];
while(i <= j) {
while (i <= j && nums[i] <= pivot) i++; //之前没有加上 i <= j就出现了一堆问题。
while (i <= j && nums[j] >= pivot) j--;
if(i < j) swap(nums[i++], nums[j--]);
else i++;
}
swap(nums[j], nums[left]);
return j;
}
};
直接写代码,其实有一些边界条件需要考虑。在Acwing上看到了另一份快速排序代码,简洁优雅,是我写不出来的代码。
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。