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++];