目录
归并排序(递归)
void _MergeSort(int* arr, int begin, int end, int* tmp) { // [begin, end]
if(begin >= end) { // 保证至少有两个元素,才需要排序。一个即为有序。
return;
}
int mid = (begin+end)/2;
// 这里的操作是将左右子区间变为有序。
// [begin, mid] [mid+1, end] 分治递归,让子区间有序。
_MergeSort(arr, begin, mid, tmp);
_MergeSort(arr, mid+1, end, tmp);
// 归并,arr中左右子区间有序了,归并到tmp中对应位置,再拷贝回来。
int begin1 = begin, end1 = mid;
int begin2 = mid+1, end2 = end;
int index = begin;
while(begin1 <= end1 && begin2 <= end2) {
if(arr[begin1] < arr[begin2]) {
tmp[index++] = arr[begin1++];
}else {
tmp[index++] = arr[begin2++];
}
}
while(begin1 <= end1) {
tmp[index++] = arr[begin1++];
}
while(begin2 <= end2) {
tmp[index++] = arr[begin2++];
}
// 此时,左右子区间合并到了tmp的对应位置上。再拷贝回arr即可
memcpy(arr+begin, tmp+begin, (end-begin+1)*sizeof(int));
}
void MergeSort(int* arr, int n) {
int* tmp = (int*)malloc(n*sizeof(int));
if(tmp == nullptr) {
cout<<"MergeSort::malloc fail"<<endl;
exit(-1);
}
_MergeSort(arr, 0, n-1, tmp);
free(tmp);
}
归并排序的大致思想:先使得左右区间有序,如上10 6 7 1 3 9 4