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;
     } 

  • 相关阅读:
    我们失去了,我们又没有失去什么
    人过 40
    KPI绩效考核为何在国内不管用?
    再也不必当心我的密码了,多个SAP 客户端自动输入密码
    大器晚成
    人际能量相吸定律
    SQL SERVER函数——表值函数的处理
    MS-SQL SERVER单列合并的四种常用方法
    实战 SQL Server 2008 数据库误删除数据的恢复
    唉,怎么一眨眼就老了!
  • 原文地址:https://www.cnblogs.com/hh13579/p/10806030.html
Copyright © 2011-2022 走看看