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

    1、算法基本思路

    设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。

    合并过程:

    合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。
    合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。
     
    重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。

    归并排序算法如下: 

    #include<iostream>
    
    using namespace std;
    
    template<class T>
    void Merge(T a[], int low, int mid, int high)
    {
        int i = low;
        int j = mid + 1;
        int k = 0;
        int *TR = new int[high - low + 1];
        while (i <= mid && j <= high)
        {
            if (a[i] < a[j])
                TR[k++] = a[i++];
            else
                TR[k++] = a[j++];
        }
        while (i<=mid)
            TR[k++] = a[i++];
        while (j <= high)
            TR[k++] = a[j++];
    
        for (int v = 0, i = low; i <= high; ++i, ++v)
            a[i] = TR[v];
    
        delete [] TR;
    }
    
    template<class T>
    void MSort(T a[], int low, int high)
    {
        int mid;
        if (low < high)
        {
            mid = (low + high) / 2;
            MSort(a, low, mid);
            MSort(a, mid + 1, high);
            Merge(a, low, mid, high);
        }
    }
    
    template<class T>
    void MergeSort(T a[], int n)
    {
        MSort(a, 0, n-1);
    }
    
    
    int main()
    {
        int a[100];
        int n;
        cout << "请输入数字个数:";
        cin >> n;
        for (int i = 0; i < n; ++i)
            cin >> a[i];
        MergeSort(a, n);
        cout << "排序后:";
        for (int i = 0; i < n; ++i)
            cout << a[i] << " ";
        cout << endl;
    
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    尾递归优化
    EOS Dawn 3.0 智能合约 -- 新格式
    以太坊钱包初探
    理解以太坊的椭圆曲线签名-校验签名
    以太坊交易字段
    以太坊的账户和交易
    以太坊源码探究之交易与签名
    以太坊交易签名
    L05 Laravel 教程
    thinkphp3.2配置redis缓存和文件缓存
  • 原文地址:https://www.cnblogs.com/yangquanhui/p/4937471.html
Copyright © 2011-2022 走看看