C输出中的合并排序 #包括 #包括 void mergesort(int数组[],int i,int j); 无效合并(int a[],int i,int j); int main(int argc,char*argv[]) { int数组[]={7,5,4,3,2,1}; 合并排序(数组,0,5); 对于(int i=0;i

C输出中的合并排序 #包括 #包括 void mergesort(int数组[],int i,int j); 无效合并(int a[],int i,int j); int main(int argc,char*argv[]) { int数组[]={7,5,4,3,2,1}; 合并排序(数组,0,5); 对于(int i=0;i,c,C,在合并代码中时,您将i元素复制到array的j到b[0]并向上复制 然后,在复制回代码中,从b[INIi]进行复制(令人震惊的变量名,但这与错误无关)。这仅在i为0时才能准确工作;通常,i不是0 假设您有一个C99或C11编译器(因此您可以在函数中的任意点定义变量),那么解决方案是: # include <stdio.h> # include <stdlib.h> void mergesort(int array[],int i,int j); void merge(in

在合并代码中时,您将
i
元素复制到
array
j
b[0]
并向上复制

然后,在复制回代码中,从
b[INIi]
进行复制(令人震惊的变量名,但这与错误无关)。这仅在
i
为0时才能准确工作;通常,
i
不是0

假设您有一个C99或C11编译器(因此您可以在函数中的任意点定义变量),那么解决方案是:

# include <stdio.h>
# include <stdlib.h>
void mergesort(int array[],int i,int j);
void merge(int a[],int i,int j);

int main(int argc,char *argv[])
{
int array[] ={7,5,4,3,2,1};
mergesort(array,0,5);
for (int i = 0; i < 6; ++i)
{
    printf("%d ",array[i] );
}



return EXIT_SUCCESS;
}


void mergesort(int array[],int i,int j)
{
int middle;
if (i == j)
    {
    return;
    }
else
    {
    middle = (i+j)/2;
    mergesort(array,i,middle);
    mergesort(array,middle+1,j);
    merge(array,i,j);
    }


} 

void merge(int array[],int i,int j)
{
int  b[100] = {0};
int forb =  0;
int INIi = i;
int middle = (i+j)/2;
int k = middle+1;
//MAKING TEMP ARRAY B
while((i<= middle) && (k <= j))
{
    if (array[i] <= array[k])
    {
        b[forb++] = array[i++]; 
    }
    else if(array[i] > array[k])
    {
        b[forb++] = array[k++];

    }
}
if (i>middle)
{
    for(;k<=j;)
    {
    b[forb++] = array[k++];
    }
}
else if (k>j)
{

for(;i<=middle;)
    {
    b[forb++] = array[i++];
    }
}
//COPYING BACK TO A
for(;INIi<= j;INIi++)

{
    array[INIi] = b[INIi]; 
}

}
int n=0;
对于(;中间)
{
对于(;kj)
{

例如,我用一个调试器一行一行地浏览代码,看看真正发生了什么。这是一个调试代码的问题,不太可能对未来的访问者有帮助。你能帮我一下吗,我还不知道如何使用C语言的调试器。
int n = 0;
for ( ; INIi <= j; INIi++)
    array[INIi] = b[n++];
if (i>middle)
{
    for(;k<=j;)
    {
        b[forb++] = array[k++];
    }
}
else if (k>j)
{
    for(;i<=middle;)
    {
        b[forb++] = array[i++];
    }
}
while (k <= j)
    b[forb++] = array[k++];
while (i <= middle)
    b[forb++] = array[i++];