#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/*
*归并排序
*思想:将待排数组多次二分为单个数(递归),再回溯合并为有序序列
*步骤1:递归二分待排数组
*步骤2:将二分数组合并为有序序列,放在零时数组中
*步骤3:将零时序列赋值给待排序序列
*步骤4:回溯
*/
/*
* 合并方法
* 待排序序列,开始索引,结束索引
*/
void Merge(vector<int>&a, int s, int e, vector<int>&temp)
{
int mid = (s + e) / 2;
int i = s, j = mid + 1;
int k = s;
while (i<=mid&&j<=e)
{
if (a[i]<=a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
//只需要管前面的是否还剩余
while (i <= mid)
temp[k++]=a[i++];
for (i = s; i < k;i++)
a[i] = temp[i];
}
/*
* 递归二分
*/
void MergeSort(vector<int>&a, int s, int e, vector<int>&temp)
{
if (s<e)
{
int mid = (s + e) / 2;
MergeSort(a, s, mid, temp);
MergeSort(a, mid + 1, e, temp);
Merge(a, s, e,temp);
}
}
int main()
{
int n;
while (cin>>n)
{
vector<int>a(n);
vector<int>temp(n);//传递零时容器进去,不用每次合并时都创建一个新的零时容器,节约时间
for (int i = 0; i < n; i++)
cin >> a[i];
MergeSort(a, 0, n - 1, temp);
for (int t : a) { cout << t << ' '; };
}
return 0;
}
归并排序
最新推荐文章于 2023-12-11 10:45:47 发布