• 归并排序


    基本思想:将待排序元素分成大小大致相同的2个子集合,

                     分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

    #include <iostream>
    
    using namespace std;
    
    int a[100],b[100];
    
    /*参数的传递是将实参的值赋给形参。
    *然而对于数组来说却是一个例外,
    *因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,
    *所以数组作为参数传递给函数的只是数组首元素的地址,
    *函数在需要用到后面元素时再按照这个地址和数组下标去查找。
    */
    void Merge(int c[],int d[],int l,int m, int r)
    {
        //合并c[1:m]和c[m+1:r]到d[l,r]
        int i = l, j = m+1, k = l;
        while(i <= m && j <= r)   //两表中元素比较,类似于打擂台,大的复制到临时数组中
        {
            if(c[i] < c[j])
            {
                d[k++] = c[i++];
            }
            else
            {
                d[k++] = c[j++];
            }
        }
    
        //若前一个子序列剩余,则直接复制入临时数组
        if(i > m)
        {
            for(int q = j; q <= r; q++)
                d[k++] = c[q];
        }
        //后一个子序列
        else
        {
            for(int q = i; q <= m; q++)
                 d[k++] = c[q];
        }
    }
    
    
    void Copy(int a[],int b[],int left,int right)
    {
        for(int i = left; i <= right; i++)
            a[i] = b[i];
    }
    
    void MergeSort(int a[],int left,int right)
    {
        if(left < right)   //至少有两个元素,也是递归的结束条件
        {
            int i = (left + right)/2;
            MergeSort(a,left,i);
            MergeSort(a,i+1,right);
            Merge(a,b,left,i,right);  //合并到临时数组b
            Copy(a,b,left,right);      //复制回数组a
        }
    }
    
    int main()
    {
        int n;
        cin >> n;
        for(int i = 0; i < n; i++)
        {
            cin >> a[i];
        }
        MergeSort(a,0,n-1);
        for(int i = 0; i < n; i++)
        {
            cout << a[i] << " ";
        }
    
        return 0;
    }
  • 相关阅读:
    031-进阶(日志)
    Django 路由系统
    C++ 面向对象(接口-抽象类)
    C++ 面向对象(多态)
    C++ 面向对象(数据抽象)
    三十、首页列表显示全部问答,完成问答详情页布局
    二十九、制作首页的显示列表
    二十八、发布功能完成
    二十七、登录之后更新导航
    二十六、完成登录功能,用session记住用户名
  • 原文地址:https://www.cnblogs.com/cjshuang/p/5183527.html
Copyright © 2020-2023  润新知