学习目标:
理解和实现归并排序算法
1.归并排序描述
(1)使用分治法的思想
(2)使用递归算法的将数组划分成两个子数组,当划分长度为1的时候就天然有序,就可以回溯回去了,接着堆两个数组进行排序
(3)将两个有序数组进行排序
2.代码实现
//合并操作函数 参数(arr:待排序数组,low:数组最左下标,mid:中间划分下标,high:最高下标,high:辅助数组!用于临时存放待排序子数组)
//B和arr的长度是一样的
void merge(vector<int>& arr, int low, int mid, int high,vector<int>&B) {
int i, j, k;
//将arr数组的low到high部分复制到辅助数组
for (i = low; i <= high; ++i) {
B[i] = arr[i];
}
//[low,mid]属于左数组,[mid+1,high]属于有数组
i = low, j = mid + 1, k = low;
//当两个下标都没超过数组范围最大值时候就需要比较两个数组对应内容
while (i<=mid&&j<=high) {
if (B[i] > B[j]) {
arr[k++] = B[j++];
}
else {
arr[k++] = B[i++];
}
}
//左数组还没存放完
while (i <= mid) {
arr[k++] = arr[i++];
}
//右数组还没有存放完
while (j <= high) {
arr[k++] = arr[j++];
}
}
//排序函数 参数(arr:待排序数组,low:最左下标,high:最右下标,B:辅助数组!!需要和arr一样长)
void sort(vector<int>&arr,int low,int high,vector<int>&B) {
//最小子数组只要划分到长度为1即可
if (low < high) {
//求出划分子数组的下标
int mid = (high + low) / 2;
cout << "mid:" << mid << endl;
//给左子树组递归排序
sort(arr, low, mid,B);
//给右子数组递归排序
sort(arr, mid + 1, high,B);
//合并左右两个数组
merge(arr, low, mid, high,B);
}
}
void test() {
vector<int>arr{ 1,5,3,7,9,4,6,8,2,10 };
vector<int>B(arr.size());
sort(arr, 0, arr.size() - 1, B);
print(arr);
}