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

    归并排序(Merging Sort)就是利用归并的思想来实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,再两两归并,... ,如此反复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

    核心代码(C实现)

    void Merge(int arr[], int low, int high)
    {
        int begin1;
        int end1;
        int begin2;
        int end2;
        int i;
        int * pTemp = NULL;
    
        if ((NULL == arr) || (low >= high)) {
            return;
        }
    
        pTemp = (int *)malloc(sizeof(int)*(high-low+1));
        begin1 = low;
        end1 = (low+high)/2;
        begin2 = end1+1;
        end2 = high;
    
        i = 0;
        while(begin1<=end1 && begin2<=end2)
        {
            if(arr[begin1]<arr[begin2])
            {
                pTemp[i] = arr[begin1];
                ++begin1;
            }
            else
            {
                pTemp[i] = arr[begin2];
                ++begin2;
            }
            ++i;
        }
    
        //将剩余元素放入数组
        while(begin1 <= end1)
        {
            pTemp[i] = arr[begin1];
            ++begin1;
            ++i;
        }
    
        while(begin2 <= end2)
        {
            pTemp[i] = arr[begin2];
            ++begin2;
            ++i;
        }
    
        //元素放回原数组
        for(i=0; i<high-low+1; ++i)
        {
            arr[low+i] = pTemp[i];
        }
    
        free(pTemp);
        pTemp = NULL;
    }
    
    void MergeSort(int arr[], int low, int high)
    {
        int mid;
    
        if ((NULL == arr) || (low >= high)) {
            return;
        }
    
        mid = (low+high)/2;
    
        //先拆分
        MergeSort(arr, low, mid);
        MergeSort(arr, mid+1, high);
    
        //合并
        Merge(arr, low, high);
    }

     核心代码(C++实现)

    #include <iostream>
    
    template <typename T>
    void merge(T array[], int low, int high)
    {
        if ((NULL == array) || low >= high) {
            return;
        }
    
        int* pTempArr = new int[high-low+1];
        int begin1 = low;
        int end1 = (low + high)/2;
        int begin2 = end1 + 1;
        int end2 = high;
    
        int index = 0;
        while ((begin1 <= end1) && (begin2 <= end2))
        {
            if (array[begin1] < array[begin2]) {
                pTempArr[index] = array[begin1];
                ++begin1;
            }
            else {
                pTempArr[index] = array[begin2];
                ++begin2;
            }
            ++index;
        }
    
        while (begin1 <= end1)
        {
            pTempArr[index] = array[begin1];
            ++begin1;
            ++index;
        }
    
        while (begin2 <= end2)
        {
            pTempArr[index] = array[begin2];
            ++begin2;
            ++index;
        }
    
        int length = high-low+1;
        for (index = 0; index < length; ++index)
        {
            array[low+index] = pTempArr[index];
        }
    
        if (pTempArr != NULL) {
            delete pTempArr;
            pTempArr = NULL;
        }
    }
    
    void mergeSort(int array[], int low, int high)
    {
        if ((NULL == array) || (low >= high)) {
            return;
        }
    
        int mid = (low + high)/2;
    
        mergeSort(array, low, mid);
        mergeSort(array, mid+1, high);
    
        merge(array, low, high);
    }
    
    #if 0
    void mergeSort(arr, 0, 8)
    {
        mid = 4;
        mergeSort(arr, 0, 4)
        {
            mergeSort(arr, 0, 2)
            {
                mergeSort(arr, 0, 1)
                {
                    mergeSort(arr, 0, 0)
                    {
                        return; // 100
                    }
                    mergeSort(arr, 1, 1)
                    {
                        return; // 2
                    }
    
                    merge(); // 2, 100
                }
                mergeSort(arr, 2, 2)
                {
                    return; // 32
                }
    
                merge(); // 2, 32, 100
            }
            mergeSort(arr, 3, 4)
            {
                mergeSort(arr, 3, 3)
                {
                    return; // 66
                }
                mergeSort(arr, 4, 4)
                {
                    return; // 78
                }
    
                merge(); // 66, 78
            }
    
            merge(); // 2, 32, 66, 78, 100
        }
        mergeSort(arr, 5, 8)
        {
            mergeSort(arr, 5, 6)
            {
                mergeSort(arr, 5, 5)
                {
                    return; // 500
                }
                mergeSort(arr, 6, 6)
                {
                    return; // -23
                }
    
                merge(); // -23, 500
            }
            mergeSort(arr, 7, 8)
            {
                mergeSort(arr, 7, 7)
                {
                    return; // -98
                }
                mergeSort(arr, 8, 8)
                {
                    return; // 123
                }
    
                merge(); // -98, 123
            }
    
            merge(); // -98, -23, 123, 500
        }
    
        merge(); // -98, -23, 2, 32, 66, 78, 100, 123, 500
    }
    #endif
    
    void print(int array[], int length)
    {
        if ((NULL == array) || length < 1) {
            return;
        }
    
        for (int index = 0; index < length; ++index)
        {
            std::cout << array[index] << " ";
        }
    }
    
    int main()
    {
        int arr[] = { 100, 2, 32, 66, 78, 500, -23, -98, 123 };
        int len = sizeof(arr)/sizeof(arr[0]);
        mergeSort(arr, 0, len-1);
        print(arr, len);
        std::cout << std::endl;
    
        return 0;
    }

    算法分析:

      最好时间复杂度:O(nlog2(n))

      平均时间复杂度:O(nlog2(n))

      最坏时间复杂度:O(nlog2(n))

        空间复杂度:O(n+log2(n))

          稳定性:稳定

  • 相关阅读:
    RAC一个节点自动重启问题分析
    Oracle Audit 审计总结
    oracle 11g日志审计
    在线剪辑歌曲
    转载:MySQL Cluster NDB(Mysql 集群)
    U 盘多系统安装盘制作神器YUMI
    转载:网站限制IP地址访问-精确到国家/省/市IP地址
    开源企业云盘Seafile部署
    K8S(二)-创建一个pod应用
    mariadb升级
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7684261.html
Copyright © 2011-2022 走看看