归并排序

来源:互联网 发布:java web入门书籍推荐 编辑:程序博客网 时间:2024/06/16 08:28
#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;}
0 0
原创粉丝点击