zoukankan      html  css  js  c++  java
  • 归并排序

    分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归求解这些子问题,然后再合并这些子问题的解来建立原问题的解。主要包括三个主要步骤:1、分解原问题 ;2、解决子问题;3、合并子问题的解

    归并排序遵循分治模式,算法的时间复杂度是O(NlogN),属于稳定排序。直观操作为:

    分解:分解待排序的n个元素的序列成各具有n/2个元素的两个子序列。

    解决:使用归并排序递归地排序两个子序列。

    合并:合并两个已排序的子序列以产生已排序的答案。

    具体算法由一个辅助函数和一个递归函数组成:

    函数代码:

    #include<iostream>
    using namespace std;
    #define INF 65535
    
    template<class T>
    void Merge(T *A, int p, int q, int r)
    {
        int n1 = q - p + 1;
        int n2 = r - q;
        T *L = new T[n1 + 1];
        T *R = new T[n2 + 1];
        for (int i = 0; i<n1; i++){
            L[i] = A[p + i];
        }
        for (int j = 0; j<n2; j++){
            R[j] = A[q + j + 1];
        }
        L[n1] = INF;
        R[n2] = INF;
        int i = 0,j = 0;
        for (int k = p; k <= r; k++)
        {
            if (L[i] <= R[j])
            {
                A[k] = L[i];
                i++;
            }
            else{
                A[k] = R[j];
                j++;
            }
        }
    
        delete[]L;
        delete[]R;
    }
    
    //二分归并排序
    template<class T>
    void MergeSort1(T *A, int p, int r)             // p r 均是元素下标
    {
        if (p<r)
        {
            int q = (p + r) / 2;
            MergeSort1(A, p, q);         
            MergeSort1(A, q + 1, r);
            Merge(A, p, q, r);
        }
    }

    测试代码:

    int main()
    {
        int arry[] = { 210, 12, 9, 1, 5, 8, 19, 4, 7, 10,15,17,21,41,51,61,81,71,91,100 };
        MergeSort1<int>(arry, 0, 19);        //调用时,是数组首元素和末尾元素下标
        for (int i = 0; i < 20; i++)
            cout << arry[i] << " ";
        cout << endl;    
        cout << "BigThink" << endl;
        system("pause");
        return 0;
    }
    View Code
  • 相关阅读:
    java学习阶段一 方法和文档注释
    java学习阶段一 二维数组
    java学习阶段一 一维数组
    java学习阶段一 循环结构
    java学习阶段一 选择结构
    java学习阶段一 运算符
    oracle学习笔记:修改表空间文件位置
    oracle学习笔记:重建临时表空间
    oracle等待事件1:Failed Logon delay等待事件
    oracle数据库删除归档日志
  • 原文地址:https://www.cnblogs.com/hello-gogo/p/7089251.html
Copyright © 2011-2022 走看看