归并排序
采用分治法的一个典型应用;
实现方法有两种:
1、自上而下的递归,所有递归的方法都可以用迭代重写
2、自下而上的迭代
c++代码,递归版
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//Merge(vec, start, mid, end);
void Merge(vector<int>& vec, int start, int mid, int end)
{
int n = end-start + 1;
vector<int> temp(n); //创建临时数组
int i = start; //左边数组起始位置
int j = mid+1; //右边数组起始位置
int k = 0; //临时数组指针
//while (i < j) //注意循环的条件,是闭区间所以是 小于等于
while (i <= mid && j<=end)
{
if (vec[i] <= vec[j])
temp[k++] = vec[i++];
else
temp[k++] = vec[j++];
}
while(i <= mid) //注意是小于等于; 左边数组有剩余时
temp[k++] = vec[i++];
while (j <= end) //右边数组有剩余时
temp[k++] = vec[j++];
for (int i = 0; i < n; i++) //更新原始数组
{
vec[start + i] = temp[i];
}
}
//数组区间是[start,end]
void MergeSort(vector<int> &vec, int start, int end)
{
if (start >= end) return; //递归终止
//if (start < end)
//{
int mid = start + (end - start) / 2;
MergeSort(vec, start, mid); //左边数组递归
MergeSort(vec, mid + 1, end); //右边数组递归
Merge(vec, start, mid, end); //合并排序数组
//}
}
int main() {
vector<int> nums{ 1,4,3,2,5,6,3 };
MergeSort(nums, 0, 6); //(0,n-1);左闭右闭区间
for (auto x : nums)
cout << x << " ";
cout << endl;
return 0;
}