zoukankan      html  css  js  c++  java
  • 归并排序 ALDS1_5_B:Merge Sort

    Merge Sort

    Write a program of a Merge Sort algorithm implemented by the following pseudocode. You should also report the number of comparisons in the Merge function.

    Merge(A, left, mid, right)
      n1 = mid - left;
      n2 = right - mid;
      create array L[0...n1], R[0...n2]
      for i = 0 to n1-1
        do L[i] = A[left + i]
      for i = 0 to n2-1
        do R[i] = A[mid + i]
      L[n1] = SENTINEL
      R[n2] = SENTINEL
      i = 0;
      j = 0;
      for k = left to right-1
        if L[i] <= R[j]
          then A[k] = L[i]
               i = i + 1
          else A[k] = R[j]
               j = j + 1
    
    Merge-Sort(A, left, right){
      if left+1 < right
        then mid = (left + right)/2;
             call Merge-Sort(A, left, mid)
             call Merge-Sort(A, mid, right)
             call Merge(A, left, mid, right)
    

    Input

    In the first line n is given. In the second line, n integers are given.

    Output

    In the first line, print the sequence S. Two consequtive elements should be separated by a space character.

    In the second line, print the number of comparisons.

    Constraints

    • n ≤ 500000
    • 0 ≤ an element in S ≤ 109

    Sample Input 1

    10
    8 5 9 2 6 3 7 1 10 4
    

    Sample Output 1

    1 2 3 4 5 6 7 8 9 10
    34
    又抄了一份题解(那个34是归并排序比较的次数)代码如下
    #include<iostream>
    #include<cstring>
    #include<stack>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    #define MAX 500000
    #define INF 2e9
    int L[MAX/2+2],R[MAX/2+2];
    int cnt;
    void merge(int A[],int n,int left,int mid,int right)
    {
        int n1=mid-left;
        int n2=right-mid;
        for(int i=0;i<n1;i++)
        {
            L[i]=A[left+i];
        }
        for(int i=0;i<n2;i++)
        {
            R[i]=A[mid+i];
        }
        L[n1]=INF;
        R[n2]=INF;
        int i=0,j=0;
        for(int k=left;k<right;k++)//合并
        {
         cnt++;
         if(L[i]<=R[j])
         A[k]=L[i++];
         else
         A[k]=R[j++];
    }
    }
    void mergeSort(int A[],int n,int left,int right)
    {
        if(left+1<right)
        {
            int mid=(left+right)/2;
            mergeSort(A,n,left,mid);
            mergeSort(A,n,mid,right);
            merge(A,n,left,mid,right); 
        }
    }
    int main()
    {
    int A[MAX],n;
    cnt=0;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>A[i];
    mergeSort(A,n,0,n);
    for(int i=0;i<n;i++)
    {
        if(i)
        cout<<" ";
        cout<<A[i];
    }
    cout<<endl;
    cout<<cnt<<endl;
    return 0;
     } 

  • 相关阅读:
    牛客网PAT练习场-有几个PAT
    牛客网PAT练习场-到底买不买
    增量数据捕获cdc
    windows terminal 笔记
    ubuntu文件夹颜色设置及vim颜色配置
    windows sub system 如何修改root密码
    Intellij IDEA 一个Tomcat启动多个Web的设置
    What is “Deploy applications configured in Tomcat instance” in IntelliJidea
    接口批量测试
    使用soupUI,jemter 测试http接口的方法
  • 原文地址:https://www.cnblogs.com/hh13579/p/10806030.html
Copyright © 2011-2022 走看看