归并排序(C++实现)

#include <iostream>
using namespace std;

void Merge(int A[], int p, int q, int r)
{
    //将两个有序序列A[p...q],A[q+1...r]合并成一个有序序列A[p...r]
    int n1 = q-p+1; //A[p...q]元素数目
    int n2 = r-q;  //A[q+1...r]元素数目
    int B[n1];
    int C[n2];
    for (int i=p; i<=q; i++)
    {
        B[i-p] = A[i];  //注:数组下标从0开始
    }
    for (int i=q+1; i<=r; i++)
    {
        C[i-q-1] = A[i];
    }
    B[n1] = INT_MAX;  //哨兵
    C[n2] = INT_MAX;
    int i = 0;
    int j = 0;
    for (int k=p; k<=r; k++)
    {
        if (B[i] <= C[j]){
            A[k] = B[i];
            i++;
        } else {
            A[k] = C[j];
            j++;
        }
    }
}
void MergeSort(int A[], int p, int r)
{
    //归并排序,分治法
    if (p<r)
    {
        int q = (p+r)/2;
        MergeSort(A, p, q);
        MergeSort(A, q+1, r);
        Merge(A,p,q,r);
    }
}
int main()
{
    int A[100];
    int i = 0;
    while (cin >> A[i])
    {
        i=i+1;
        if (cin.get() == '\n') break;
    }
    int r = i;
    MergeSort(A, 0, r-1);
    for (int k=0; k<r; k++)
    {
        cout << A[k] << " ";
    }
    cout << endl;
    return 0;
}

  

posted @ 2020-08-27 17:37  大战拖延  阅读(260)  评论(0)    收藏  举报