• C++ 实现MergeSort算法


    算法思想:

    假设有两个人,每人手里都有一部分牌,而且每个人手中的牌都按大小顺序排列好了。
    那么,现在要把两个人手中的牌合并到一起,并且合并后要从小到大依次排好,可以这样做:
    每个人都从手中拿出最小的牌,然后比较,谁的牌小就把该张牌放在桌面上,牌大的一方牌仍然拿在手中,待下次再比较。
    下一次每个人又拿最小的牌进行比较,如此下去。。。直到一方手中的牌全部放在了桌面上,这时另一方就可以把牌按从小到大的顺序全部放在桌面上了。
    这时,桌面上的牌显然是排好了序的。
    这就是归并排序法的主要思想。当然,有归并,首先就得分割,得把手中的牌分到两个人手中,然后分到四个人手中。。。
    一直分到每人手中只有一张牌。然后才可以每两个人进行合并,最后合并到一个人的手中。

    c++实现:

    #include <iostream>
    using namespace std;
    
    #define N 100
    
    int g_array[N];     //存放输入的数字
    static int count;   //存放元素的个数
    
    // 初始化函数
    void Initial()
    {
        cout << "请输入元素的个数:";
        cin >> count;
        cout << "请输入" << count << "个元素:";
        for(int i = 0; i < count; i ++)
        {
            cin >> g_array[i];
        }
    }
    
    //合并函数
    void Merge(int a[], int l, int m, int r)
    {
        int i = l, j = m+1, k = l;
        int b[N];
        while(i <= m && j <= r)
        {
            if(a[i] <= a[j])
            {
                b[k++] = a[i++];
            }
            else
            {
                b[k++] = a[j++];
            }
        }
    
        if(i > m)
        {
            for(int p = j; p <= r; p ++)
            {
                b[k++] = a[p];
            }
        }
        else
        {
            for(int p = i; p <= m; p ++)
            {
                b[k++] = a[p];
            }
        }
    
        //把b[]中排好的元素copy到a[]中
        for(int q = l; q <= r; q ++)
        {
            a[q] = b[q];
        }
    }
    
    //  归并排序 递归算法表示
    void MergeSort(int a[], int left, int right)
    {
        if(left < right)    //数组至少要有两个元素
        {
            int i = (right + left)/2;
            MergeSort(a, left, i);
            MergeSort(a, i+1, right);
            Merge(a, left, i, right); //把left到right的元素排序好
        }
    }
    
    //打印排好序的数组
    void Print()
    {
        cout << "经过MergeSort后:";
        for(int i = 0; i < count; i ++)
        {
            cout << g_array[i] << " ";
        }
        cout << endl;
    }
    
    int main()
    {
        Initial();
        if(count > 1)
        {
            MergeSort(g_array, 0, count-1);
            Print();
        }
        else if(count == 1)
        {
            Print();
        }
        system("pause");
        return 0;
    }

     

     

    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    Vs code 通用插件
    VS Code 使用小技巧
    vscode: Visual Studio Code 常用快捷键
    AngularJS 和 Electron 构建桌面应用
    设计模式(四)简单工厂模式
    java必备——经典的Hibernate
    操作系统之分页分段介绍
    Js 标签云
    Android多线程分析之中的一个:使用Thread异步下载图像
    033 调整数组顺序使奇数位于偶数前面(keep it up)
  • 原文地址:https://www.cnblogs.com/kedebug/p/2791764.html
Copyright © 2020-2023  润新知