归并排序:用递归来写
直接上代码
#include <iostream>
#include <vector>
using namespace std;
// 将[l,mid] [mid+1,r]两段合并并在arr数组上直接更改
void merge(vector<int>& arr, int l, int mid, int r){
// 将[l,r]段的值用临时变量存储,长度是r-l+1
vector<int> temp(arr.begin()+l, arr.begin()+r+1);
// 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1
// k 指向arr,将结果写回arr
int i = 0;
mid = mid - l + i;
int j = mid + 1;
// k在原始数组上遍历
for(int k = l; k <= r; ++k){
if(i > mid){ // 如果左半部分元素已经全部处理完毕,直接等于右侧的即可
arr[k] = temp[j];
++j;
}
else if(j >= r-l+1){ // 如果右半部分元素已经全部处理完毕,直接等于左侧的即可
arr[k] = temp[i];
++i;
}
else if(temp[i] < temp[j]) { // 左半部分所指元素 < 右半部分所指元素
arr[k] = temp[i];
++i;
}
else{ // 左半部分所指元素 >= 右半部分所指元素
arr[k] = temp[j];
++j;
}
}
}
// 递归使用归并排序,对arr[l...r]的范围进行排序
void mergeSort(vector<int>& arr, int l, int r){
if(l >= r)
return;
int mid = (l+r)/2;
mergeSort(arr, l, mid);
mergeSort(arr, mid+1, r);
merge(arr, l, mid, r);
}
void mergeSort(vector<int>& arr){
mergeSort(arr, 0, arr.size()-1);
}
int main(){
vector<int> arr{4,3,2,1,5,6,8,7};
mergeSort(arr);
for(auto c : arr)
cout << c << endl;
return 0;
}