//归并排序
//01 递归形式做法
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
void merge1(int arr[], int temp[], int start, int mid, int end){
//对于merge操作主要描述下来就是将2个已经有序的序列进行合并
//就是定义两个指针和一个与两个序列元素数量之和相同的数组temp,
//从这两个序列a, b开头开始比较,如果a[i]>b[j],就将b[j]放入temp中间数组
//反之就将a[i]放入temp数组,这个k就是那个temp数组的指针
//之后有2中特殊情况,之后描述
int i = start, j = mid + 1, k = start;
//这里判断就是为了将i, j这代表2个序列的的下标控制住
while(i < mid + 1 && j < end + 1){
//虽然前面举例子是a[i], b[j],但是这里面这两个有序序列
//是以mid为分界线的同一个数组中的2个序列,所以叫做二路归并
if(arr[i] < arr[j]){
temp[k] = arr[i];
//注意将2个指针都向后移动
i++, k++;
}else{
temp[k] = arr[j];
j++, k++;
}
}
//这里的条件判断如果成立,就代表前面的判断是j<end+1不满
//足,所以这里就是特殊情况:其中一个序列a已经遍历完成,另外一个
//序列b还没有完成,那么因为我们做的操作是将两个已经有序的序列
//合成成为一个序列,那么就代表没有遍历完成的序列b已经有序,
//所以将之后的序列全部插入就可以
while(i < mid +1){
temp[k] = arr[i];
i++, k++;
}
//这里和上面这一种情况一致
while(j < end + 1){
temp[k] = arr[j];
j++, k++;
}
//这里就是将已经排好序的数组temp再赋值给arr,
//这个temp数组的使命就是存放排好序的数组之后再赋值给原数组
for(i = 0;i < end+1;i++){
arr[i] = temp[i];
}
}
void merge_sort1(int arr[], int temp[], int start, int end){
//当start >= end的时候,代表已经分到了最小,也就是1个元素
//当然也就是有序了
if(start >= end)
return;
//这里使用小+(大-小)/2的原因是担心数据越界,也就是假如
//小=大=2^32-1,那么小+大就会越界
int mid = start + (end - start) / 2;
//进入递归,首先是将首元素到mid-1为止的元素变得有序
merge_sort1(arr, temp, start, mid);
//进入递归,这里是将mid+1的元素到end的元素都变得有序
merge_sort1(arr, temp, mid+1, end);
//这里是将2个有序的序列进行合并,也就是归并排序的核心操作
merge1(arr, temp, start, mid, end);
}
c++归并算法深入解析(行代码注释解析)(小白写作,有错误,请指正)
最新推荐文章于 2021-11-07 00:36:02 发布