归并排序,是运用了分治思想。 merge函数先用递归来分,再用排序来治。分是往下分,治是往上合。
#include<iostream>
using namespace std;
void mergeSort(int num[], int l, int r){
int mid = (l+r)/2;
// 左边的两个指针
int left1 = l, right1 = mid;
// 右边的两个指针
int left2 = mid+1, right2 = r;
// 辅助数组
int tmp[r-l+1], k=0;
// 相当于合并两个有序数组
while(left1 <= right1 && left2 <= right2){
if(num[left1] < num[left2]){
tmp[k++] = num[left1++];
}else{
tmp[k++] = num[left2++];
}
}
while(left1 <= right1){
tmp[k++] = num[left1++];
}
while(left2 <= right2){
tmp[k++] = num[left2++];
}
// 排好序后赋给num
for(int i=l, k=0; i<=r; i++, k++){
num[i] = tmp[k];
}
}
void merge(int num[], int l, int r){
if(l>=r) {
return;
}
// 分割左边
merge(num, l, (l+r)/2);
// 分割右边
merge(num, (l+r)/2+1, r);
// 合并左右两边的有序数组
mergeSort(num, l, r);
}
int main(){
int num[7]={3,2,4,6,5,7,1};
merge(num, 0, 6);
// 输出
for(int i=0; i<7; i++){
cout << num[i] << " ";
}
return 0;
}