快速排序
算法流程:每次随机指定一个数,一次循环找到这一个数的位置,然后递归接着找。
int partition(vector<int> &nums,int left,int right){
int value = nums[left];
while(left<right){
while(left<right && nums[right]>=value) right--;
while (left<right && nums[left]<=value) left++;
swap(nums[left], nums[right]);
}
swap(value, nums[left]);
return left;
}
void quickSort(vector<int> &nums,int left,int right){
if(left>=right){
return ;
}
else{
int index = partition(nums,left,right);
quickSort(nums, left, index-1);
quickSort(nums, index+1, right);
}
return ;
}
注意点: 每次从右边开始递减,循环的时候得加上left<right的条件。
归并排序
算法流程: 使用分治的思想,先将数组分成小的数组块,之后把每个子数组排序,这里的排序算法等价于合并两个有序子序列,合并完之后把tmp数组里面的内容拷贝回原数组中。
void merge(vector<int> &nums,vector<int> &tmp,int left,int right){
int i = left, mid = (left+right-1)/2,j=mid+1,pos=left;
while(i<=mid && j<=right){
if(nums[i]<nums[j]) tmp[pos++] = nums[i++];
else tmp[pos++] = nums[j++];
}
while(i<=mid) tmp[pos++] = nums[i++];
while(j<=right) tmp[pos++] = nums[j++];
for(int i=left;i<=right;i++) nums[i] = tmp[i];
return ;
}
void merge_sort(vector<int> &nums,vector<int> &tmp,int left,int right){
if(left>=right){
return ;
}
else{
int mid = (left+right-1)/2;
merge_sort(nums, tmp, left, mid);
merge_sort(nums, tmp, mid+1, right);
merge(nums,tmp,left,right);
}
return ;
}
注意点:mid取值,子区间的边界需要注意。
堆排序:见这篇blog。