依然是递归三部曲:
1.递归什么时候结束:当start和end相等时,无法继续再分下去。
2.递归返回的是什么:返回的是已经完成归并排序的子数组(即返回的是升序序列)。
3.每个递归中要做什么:对两个已经完成归并排序的子数组[start,mid]和[mid+1,end]重新进行归并排序。
#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
//归并排序
void merge(vector<int>&data, int start, int mid, int end) {//归并[start,mid]和[mid+1,end],此时左右两边都是升序序列
vector<int> temp(data);//辅助数组
int first_start = start;//初始化为前半段第一个数字的下标
int second_start = mid + 1;//初始化为后半段第一个数字的下标
int copy_start = start;//初始化为辅助数组第一个数字的下标
while (first_start <= mid&&second_start <= end)
{
if (data[first_start] <= data[second_start])
temp[copy_start++] = data[first_start++];
else
{
temp[copy_start++] = data[second_start++];
}
}
//若second_start先到了后半段末尾
while (first_start <= mid)
temp[copy_start++] = data[first_start++];
//若first_start先到了前半段末尾
while (second_start <= end)
temp[copy_start++] = data[second_start++];
for (int i = start; i <= end; i++)
data[i] = temp[i];
}
void MergeSort(vector<int>&data, int start, int end) {
if (start == end)
return;
int mid = (start + end) / 2;
MergeSort(data, start, mid);//已经将[start,mid]完成排序
MergeSort(data, mid + 1, end);//已经将[mid+1,end]完成排序
merge(data, start, mid, end);//本级递归要做的就是把两个有序序列[start,mid]和[mid+1,end]进行归并
}
int main() {
vector<int>v = { 7,5,6,4 };
MergeSort(v, 0, v.size() - 1);
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
system("pause");
return 0;
}