C++用递归方法写归并排序


#include
using namespace std;
/*void Merge(int *A,int p,int q,int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    int L[n1 + 1];
    int R[n2 + 1];

    for(int i = 1; i <= n1; i++)
    {
        L[i] = A[p + i - 1];
    }

    for(int j = 1; j <= n2 ; j++)
    {
        R[j] = A[q + j];
    }

    int i = 1,j = 1;

    for(int k = p; k <= r; k++)
    {
        if(L[i]<=R[j])
        {
            A[k] = L[i];
            i++;
        }
        else{
            A[k] = R[j];
            j++;
        }
    }

}
*/

void Merge(int* A, int low, int mid, int high)
{
    int i, j, k;
    int* B = new int[sizeof(int)*high];
    for (int i = 1; i < high - low - 2; i++)
    {
        cout << B[i] << " ";
    }
    cout << endl;
    i = low;
    j = mid + 1;
    k = low;
    while (i <= mid && j <= high)
    {
        if (A[i] < A[j])
        {
            B[k++] = A[i++];
        }
        else
        {
            B[k++] = A[j++];
        }
    }
        while (i <= mid)
        {
            B[k++] = A[i++];
        }

        while (j <= high)
        {
            B[k++] = A[j++];
        }

        for (int i = 1; i <= high; i++)
        {
            cout << B[i] << " ";
        }
        cout << endl;
    
}
void Merge_Sort(int* A, int low, int high)
{
    int mid;
    if (low < high)
    {
        mid = ((low + high) / 2);
        Merge_Sort(A, low, mid);
        Merge_Sort(A, mid + 1, high);
        Merge(A, low, mid, high);
    }

}


int main()
{
    int A[11] = { 0,10,9,8,7,6,5,4,3,2,1 };

    Merge_Sort(A, 1, 10);

    for (int i = 1; i <= 10; i++)
    {
        cout << A[i] << " ";
    }

    return 0;
}

这是一个递归的归并排序,我不知道哪里错了.希望能有一个正确的答案

是编译有错,还是结果不对???

#include<iostream>
using namespace std;

void Merge(int* A, int low, int mid, int high,int *B)
{
    int i, j, k;
    i = low;
    j = mid + 1;
    k = 0;
    while (i <= mid && j <= high)
    {
        if (A[i] < A[j])
        {
            B[k++] = A[i++];
        }
        else
        {
            B[k++] = A[j++];
        }
    }
        while (i <= mid)
        {
            B[k++] = A[i++];
        }
 
        while (j <= high)
        {
            B[k++] = A[j++];
        }
        //
        k=0;
         while(low <= high){
            A[low++] = B[k++];
        }
    
}
void Merge_Sort(int* A, int low, int high,int *B)
{
    int mid;
    if (low < high)
    {
        mid = ((low + high) / 2);
        Merge_Sort(A, low, mid,B);
        Merge_Sort(A, mid + 1, high,B);
        Merge(A, low, mid, high,B);
    }
 
}
 
 
int main()
{
    int A[10] = { 4,9,2,7,6,5,10,3,8,1 };
    int B[10];
 
    Merge_Sort(A, 0, 9,B);
 
    for (int i = 0; i <= 9; i++)
    {
        cout << A[i] << " ";
    }
    return 0;
}

你的merge代码没有考虑left和right数组元素不等的情况。

#include <iostream>
using namespace std;

void Merge(int *A, int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;

    int *L = new int[n1];
    int *R = new int[n2];

    for (int i = 0; i < n1; i++)
        L[i] = A[p + i];

    for (int j = 0; j < n2; j++)
        R[j] = A[q + j + 1];

    int i = 0;
    int j = 0;
    int k = p;

    // Merge L[] and R[] into A[]
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
            A[k++] = L[i++];
        else
            A[k++] = R[j++];
    }
    // Copy the remaining element of L[], if there are any
    while (i < n1)
        A[k++] = L[i++];
    // Copy the remaining element of R[], if there are any
    while (j < n2)
        A[k++] = R[j++];

    delete[] L;
    delete[] R;
}

void Merge_Sort(int *A, int low, int high)
{
    int mid;
    if (low < high)
    {
        mid = (low + high) / 2;
        Merge_Sort(A, low, mid);
        Merge_Sort(A, mid + 1, high);
        Merge(A, low, mid, high);
    }
}

int main()
{
    int A[11] = {0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    Merge_Sort(A, 1, 10);
    for (int i = 1; i <= 10; i++)
        cout << A[i] << " ";
    return 0;
}