归并排序,无法顺序答应出来的原因是什么

归并排序,无法顺序答应出来的原因是什么

#include<stdio.h>
#include<stdlib.h>

#define N 7
typedef int ElemType;
//合并两个有序数列 
void Marge(ElemType *A,int low,int mid,int high){
    //1.定义分割开部分前一半的遍历元素,后一半的遍历元素,和新空间的遍历元素
    int i,j,k;
    //2.申请新空间
    static ElemType B[N];
    //3.将A中的元素全部放入B中
    for(i=low;i<high;i++){
        B[i] = A[i];
    }
    //4.判断入队
    k = low;
    for(i=low,j=mid+1;i<=mid && j<=high;k++){
        if(B[i] <= B[j]){
            A[k] = B[i];
            i++;
        }else{
            A[k] = B[j];
            j++;
        }
    }
    //5.将最后一个数组中有剩余的元素放入
    while(i<=mid){
        A[k] = B[i];
        i++;
        k++;
    }
    while(j<=high){
        A[k] = B[j];
        j++;
        k++;
    } 
} 
//归并排序
void MargeSort(ElemType *A,int low ,int high){
    //1.递归结束的条件
    if(low<high){
        int mid = (high+low)/2;
        //不断递归分割
        MargeSort(A,low,mid);//排序好前一半 
        MargeSort(A,mid+1,high);//排序好后一半 
        //合并函数
        Marge(A,low,mid,high);  
    } 
} 
void print_Table(ElemType *A){
    int i;
    for(i=0;i<N;i++){
        printf("%3d",A[i]);
    }
    printf("\n");
}
int main(){
    int A[N] ={49,38,65,97,76,13,27};
    print_Table(A);
    MargeSort(A,0,6);
    print_Table(A);
    return 0;
     
} 

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

// 合并两个有序数列
void Merge(ElemType *A, int low, int mid, int high) {
    int i, j, k;
    ElemType *B = (ElemType *)malloc((high - low + 1) * sizeof(ElemType)); // 动态分配新空间

    // 将A中的元素全部放入B中
    for (i = low; i <= high; i++) {
        B[i - low] = A[i];
    }

    // 判断入队
    k = low;
    for (i = low, j = mid + 1; i <= mid && j <= high; k++) {
        if (B[i - low] <= B[j - low]) {
            A[k] = B[i - low];
            i++;
        } else {
            A[k] = B[j - low];
            j++;
        }
    }

    // 将最后一个数组中有剩余的元素放入
    while (i <= mid) {
        A[k] = B[i - low];
        i++;
        k++;
    }
    while (j <= high) {
        A[k] = B[j - low];
        j++;
        k++;
    }

    free(B); // 释放动态分配的内存
}

// 归并排序
void MergeSort(ElemType *A, int low, int high) {
    // 递归结束的条件
    if (low < high) {
        int mid = (high + low) / 2;
        // 不断递归分割
        MergeSort(A, low, mid);      // 排序前一半
        MergeSort(A, mid + 1, high); // 排序后一半
        // 合并函数
        Merge(A, low, mid, high);
    }
}

void print_Table(ElemType *A, int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%3d", A[i]);
    }
    printf("\n");
}

int main(){
    int A[N] ={49,38,65,97,76,13,27};
    print_Table(A, 7);    
    MargeSort(A,0,6);
    print_Table(A, 7);
    return 0;
}



    for(i=low;i<=high;i++){
        B[i] = A[i];
    }

只要修改3.将A中的元素全部放入B中,即可。
遍历时未将最后一位元素存入B中