图解(来源于网络)
代码详解
#include<iostream>
#include<vector>
using namespace std;
void Merge_sort(vector<int>&array, vector<int>&tempArray, int left, int right);
void merge(vector<int>&array, vector<int>&tempArray, int left, int mid, int right);
void Arr_print(vector<int>arr);
//归并的入口函数
void Merge_sort(vector<int>&array, vector<int>&tempArray, int left, int right) {
int mid = (left + right) / 2; //获得中间元素的下标,将数组一分为二
if (left < right)
{
Merge_sort(array, tempArray, left, mid); //左半部分数组一分为二
Merge_sort(array, tempArray, mid+1, right); //右半部分数组一分为二
merge(array, tempArray, left, mid, right); //将上面一分为二的部分归并排序
Arr_print(array);
}
}
void merge(vector<int>&array, vector<int>&tempArray, int left, int mid, int right)
{
//左边区域第一个没有排序的元素下标
int l_index = left;
//右边区域第一个没有排序的元素下标
int r_index = mid + 1;
//临时数组开始的元素下标
int temp_index = left;
//复制时候的开始下标
int copy_index = left;
//开始合并
while (l_index <= mid && r_index <= right) {
// 比较两段元素中头元素的大小,取最小的元素放入临时数组中
if (array[l_index] < array[r_index])
tempArray[temp_index++] = array[l_index++];
else
tempArray[temp_index++] = array[r_index++];
}
//若左半边元素有剩余
while(l_index<=mid)
tempArray[temp_index++] = array[l_index++];
//若右半边元素有剩余
while(r_index<=right)
tempArray[temp_index++] = array[r_index++];
//将临时数组中的数据,此时已经排好顺序,拷贝到原数组中
while (copy_index <= right) {
array[copy_index] = tempArray[copy_index];
copy_index++;
}
}
//打印数组函数
void Arr_print(vector<int>arr)
{
for (auto a : arr)
cout << a;
cout << endl;
}
int main()
{
vector<int>arr = { 8,7,6,5,4,3,2,1};
cout << "原数组为:" << endl;;
Arr_print(arr);
cout << "开始归并" << endl;
vector<int>tempArr;
tempArr.resize(arr.size());
int start_index = 0;
int end_index = arr.size() - 1;
Merge_sort(arr, tempArr, start_index, end_index);
}
输出为
原数组为:
87654321
开始归并
78654321
78564321
56784321
56783421
56783412
56781234
12345678