首页 > 学院 > 开发设计 > 正文

归并排序

2019-11-14 13:14:19
字体:
来源:转载
供稿:网友
#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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表