912. 排序数组(快排、冒泡、归并)
题目描述
leetcode - 912:https://leetcode-cn.com/problems/sort-an-array/
解题关键
- 快排
- 冒泡
- 归并
代码
class Solution {
// 快速排序
int partition(vector<int>& nums,int l,int r){
int pos = nums[r];
int flag = r;
while(l<r){
while(nums[l]<=pos&&l<r) l++;
while(nums[r]>=pos&&l<r) r--;
swap(nums[l],nums[r]);
}
swap(nums[flag],nums[r]);
return r;
}
int randomized_partition(vector<int>& nums,int l,int r){
int i = rand()%(r-l+1)+l;
swap(nums[i],nums[r]);
int pos = partition(nums,l,r);
return pos;
}
void quick_sort(vector<int>& nums,int l,int r){
if(r>l){
int pos = randomized_partition(nums,l,r);
quick_sort(nums,l,pos-1);
quick_sort(nums,pos,r);
}
}
// 冒泡排序
void bubble_sort(vector<int>& nums){
for(int i=nums.size()-1;i>=0;i--){
int flag = 0;
for(int j=0;j<i;j++){
if(nums[j]>nums[j+1]){
flag=1;
swap(nums[j],nums[j+1]);
}
}
if(flag==0){
return;
}
}
}
// 归并排序
vector<int> tmp;
void merge_sort(vector<int>& nums,int l,int r){
if(l>=r) return;
int mid = (l+r)/2;
merge_sort(nums,l,mid);
merge_sort(nums,mid+1,r);
int cnt = 0;
int tmpL1 = l;
int tmpL2 = mid+1;
while(tmpL1<=mid&&tmpL2<=r){
if(nums[tmpL1]>nums[tmpL2]){
tmp[cnt++]=nums[tmpL2++];
}else{
tmp[cnt++]=nums[tmpL1++];
}
}
while(tmpL1<=mid){
tmp[cnt++]=nums[tmpL1++];
}
while(tmpL2<=r){
tmp[cnt++]=nums[tmpL2++];
}
for(int i=0;i<r-l+1;i++) nums[i+l]=tmp[i];
}
public:
vector<int> sortArray(vector<int>& nums) {
// quick_sort(nums,0,(int)nums.size()-1); //快速排序
// bubble_sort(nums); //冒泡排序
// tmp.resize((int)nums.size(), 0);
// merge_sort(nums,0,(int)nums.size()-1); //归并排序
return nums;
}
};

浙公网安备 33010602011771号