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

    /* 来自《算法分析与设计》 代码来自网络https://blog.csdn.net/m0_38068229/article/details/81262282*/
    /*
    输入:数组A[1...m]和它的三个索引p,q,r,1<=p<=q<r<=m,两个子数组A[p...q]和A[q+1...r]各自按升序排列
    输出:合并两个子数组A[p...q]和A[q+1...r]的数组A[p...r]
    comment:B[p...r]是个辅助数组
    s <- p; t <- q+1; k <- p;
    while s <= q and t <= r
        if A[s] <= A[t] then
            B[k] <- A[s]
            s <- s+1
        else
            B[k] <- A[t]
            t <- t+1
        end if
        k <- k+1
    end while
    if s = q+1 then B[k...r] <- A[t...r]
    else B[k...r] <- A[s...q]
    end if
    A[p...r] <- B[p...r]
    */
    #include<iostream>
    using namespace std;
    
    //归并过程
    void merge(int arr[], int l, int mid, int r);
    //递归
    static void mergeSort(int arr[], int l, int r);
    //归并排序整个数组
    void mergeSort(int arr[], int n);
    
    int main()
    {
        int n;
        while(cin >> n)
        {
            int arr[n];
            for(int i = 0; i < n; i++)
                cin >> arr[i];
            mergeSort(arr, n);
            cout << "After sorted:" << endl;
            for(int i = 0; i < n; i++)
                cout << arr[i] << " ";
            cout << endl;
        }
        return 0;
    }
    
    //归并
    void merge(int arr[], int l, int mid, int r)
    {
        int help[r-l+1];  //辅助数组
        int i = 0;
        int lIndex = l;
        int rIndex = mid+1;
        while(lIndex <= mid && rIndex <= r)
        {
            help[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++];
        }
        //左边或右边有一边到头了,不可能同时到,因为每次只移动一边。
        while(lIndex <= mid)
        {
            help[i++] = arr[lIndex++];
        }
        while(rIndex <= r)
        {
            help[i++] = arr[rIndex++];
        }
        //将排好序的辅助数组复制给原始数组,不需要返回值
        for(i = 0; i < r-l+1; i++)
        {
            arr[l+i] = help[i];
        }
    }
    
    //递归
    static void mergeSort(int arr[], int l, int r)
    {
        if(l == r) return;
        int mid = (l+r)/2;
        //左半部分归并排序
        mergeSort(arr, l, mid);
        //右半部分归并排序
        mergeSort(arr, mid+1, r);
        //左右部分归并
        merge(arr, l, mid, r);
    }
    
    //归并排序整个数组
    void mergeSort(int arr[], int n)
    {
        //如果数组为空或只有一个元素,不需要排序
        if(arr == NULL || n < 2) return;
        mergeSort(arr, 0, n-1);
    }

    运行结果:

    运行结果 

  • 相关阅读:
    codeforces#571Div2 D---Vus the Cossack and Numbers【贪心】
    洛谷P1050 循环【java大数】
    洛谷P1972 HH的项链【树状数组】
    uoj#67 新年的毒瘤【Tarjan】
    洛谷1265 公路修建【最小生成树】
    【超实用工具】三维场景绘制工具
    坐标地址批处理工具
    CAD转KML乱码处理
    地理编码逆编码教程
    最新!全球ALOS 12m地形数据介绍及下载
  • 原文地址:https://www.cnblogs.com/harbin-ho/p/12656954.html
Copyright © 2011-2022 走看看