合并排序没有给出正确的输出,c
merge sort not giving correct output, c
我已经使用指针制作了一个合并排序代码,因为我想让代码在它工作并且它给出错误后动态化output.Could它可以使用动态全局数组来完成,如果是的话如何?以及什么以下代码错误:
#include<stdio.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int b[n];
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<(*(a+(l2 )))){
b[i]=*(a+(l1 ));
l1++;
}
else{
b[i]=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
b[i++]=(*(a+(l1 )));
l1++;
}
while(l2<=mid){
b[i++]=(*(a+(l1 )));
l2++;
}
for(i=low;i<=high;i++){
( *(a+(l1 )))=b[i];
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int a[3]={5,2,1};
sort(&a[0],0,2,3);
for(int i=0;i<3;i++){
printf("%d ",a[i]);
}
}
或者如果有人有任何想法使用动态大小的数组来制作这个程序,我很好 that.I 也为此编写了一个没有指针的代码,它可以工作但使用全局变量并因此固定 arrays.I 我把它贴在下面仅供参考,因为我所做的只是在该代码中实现指针。
#include<stdio.h>
int a[6]={5,2,1,6,3,4};
int b[6];
void merge(int low,int mid,int high){
int l1=low,l2=mid+1,i;
for(i=low;l1<=mid&&l2<=high;i++){
if(a[l1]<a[l2]){
b[i]=a[l1++];
}
else{
b[i]=a[l2++];
}
}
while(l1<=mid){
b[i++]=a[l1++];
}
while(l2<=mid){
b[i++]=a[l2++];
}
for(i=low;i<=high;i++){
a[i]=b[i];
}
}
void sort(int low,int high){
if(low<high){
int mid=(low+high)/2;
sort(low,mid);
sort(mid+1,high);
merge(low,mid,high);
}
else {
return;
}
}
int main(void){
sort(0,5);
for(int i=0;i<=6;i++){
printf("%d ",a[i]);
}
}
将代码更改为以下内容进行调试后 better:I 发现 b 没有被赋值,a 也没有:
#include<stdio.h>
#include<stdlib.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int *b=malloc(n );
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<(*(a+(l2 )))){
(*(b+(i )))=*(a+(l1 ));
debug pritnf("%d\n",(*(b+(i ))));
l1++;
}
else{
(*(b+(i )))=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
(*(b+(i )))=(*(a+(l1 )));
l1++;
i++;
}
while(l2<=mid){
(*(b+(i )))=(*(a+(l1 )));
l2++;
i++;
}
for(i=low;i<=high;i++){
( *(a+(l1 )))=(*(b+(i )));
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int a[3]={5,2,1};
sort(&a[0],0,2,3);
for(int i=0;i<3;i++){
printf("%d ",a[i]);
}
}
在这开始工作并且它完全工作之后我尝试了动态数组但它没有为我提供正确的输出因为中间有零而且最大的数字不是 there.The 代码如下:
#include<stdio.h>
#include<stdlib.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int *b=malloc((n-1) *sizeof(int));
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<=(*(a+(l2 )))){
(*(b+(i )))=*(a+(l1 ));
l1++;
}
else{
(*(b+(i )))=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
(*(b+(i )))=(*(a+(l1 )));
l1++;
i++;
}
while(l2<=mid){
(*(b+(i )))=(*(a+(l1 )));
l2++;
i++;
}
for(i=low;i<=high;i++){
( *(a+(i )))=(*(b+(i )));
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
sort(&a[0],0,n-1,n);
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
}
只看代码,复制返回循环需要修复:
for(i=low;i<=high;i++){
( *(a+(i )))=(*(b+(i ))); /* a+(i) not a+(l1) */
}
该代码并非真正基于指针,它只是使用了 a[i] 的替代语法,即 *(a+i)。对于基于指针的合并排序版本,low、mid、high 应该是指针,而不是索引。
我已经使用指针制作了一个合并排序代码,因为我想让代码在它工作并且它给出错误后动态化output.Could它可以使用动态全局数组来完成,如果是的话如何?以及什么以下代码错误:
#include<stdio.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int b[n];
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<(*(a+(l2 )))){
b[i]=*(a+(l1 ));
l1++;
}
else{
b[i]=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
b[i++]=(*(a+(l1 )));
l1++;
}
while(l2<=mid){
b[i++]=(*(a+(l1 )));
l2++;
}
for(i=low;i<=high;i++){
( *(a+(l1 )))=b[i];
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int a[3]={5,2,1};
sort(&a[0],0,2,3);
for(int i=0;i<3;i++){
printf("%d ",a[i]);
}
}
或者如果有人有任何想法使用动态大小的数组来制作这个程序,我很好 that.I 也为此编写了一个没有指针的代码,它可以工作但使用全局变量并因此固定 arrays.I 我把它贴在下面仅供参考,因为我所做的只是在该代码中实现指针。
#include<stdio.h>
int a[6]={5,2,1,6,3,4};
int b[6];
void merge(int low,int mid,int high){
int l1=low,l2=mid+1,i;
for(i=low;l1<=mid&&l2<=high;i++){
if(a[l1]<a[l2]){
b[i]=a[l1++];
}
else{
b[i]=a[l2++];
}
}
while(l1<=mid){
b[i++]=a[l1++];
}
while(l2<=mid){
b[i++]=a[l2++];
}
for(i=low;i<=high;i++){
a[i]=b[i];
}
}
void sort(int low,int high){
if(low<high){
int mid=(low+high)/2;
sort(low,mid);
sort(mid+1,high);
merge(low,mid,high);
}
else {
return;
}
}
int main(void){
sort(0,5);
for(int i=0;i<=6;i++){
printf("%d ",a[i]);
}
}
将代码更改为以下内容进行调试后 better:I 发现 b 没有被赋值,a 也没有:
#include<stdio.h>
#include<stdlib.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int *b=malloc(n );
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<(*(a+(l2 )))){
(*(b+(i )))=*(a+(l1 ));
debug pritnf("%d\n",(*(b+(i ))));
l1++;
}
else{
(*(b+(i )))=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
(*(b+(i )))=(*(a+(l1 )));
l1++;
i++;
}
while(l2<=mid){
(*(b+(i )))=(*(a+(l1 )));
l2++;
i++;
}
for(i=low;i<=high;i++){
( *(a+(l1 )))=(*(b+(i )));
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int a[3]={5,2,1};
sort(&a[0],0,2,3);
for(int i=0;i<3;i++){
printf("%d ",a[i]);
}
}
在这开始工作并且它完全工作之后我尝试了动态数组但它没有为我提供正确的输出因为中间有零而且最大的数字不是 there.The 代码如下:
#include<stdio.h>
#include<stdlib.h>
void merge(int *a,int low,int mid,int high,int n){
int l1=low,l2=mid+1,i;
int *b=malloc((n-1) *sizeof(int));
for(i=low;l1<=mid&&l2<=high;i++){
if((*(a+(l1 )))<=(*(a+(l2 )))){
(*(b+(i )))=*(a+(l1 ));
l1++;
}
else{
(*(b+(i )))=*(a+(l2 ));
l2++;
}
}
while(l1<=mid){
(*(b+(i )))=(*(a+(l1 )));
l1++;
i++;
}
while(l2<=mid){
(*(b+(i )))=(*(a+(l1 )));
l2++;
i++;
}
for(i=low;i<=high;i++){
( *(a+(i )))=(*(b+(i )));
}
}
void sort(int *a,int low,int high,int n){
if(low<high){
int mid=(low+high)/2;
sort(a,low,mid,n);
sort(a,mid+1,high,n);
merge(a,low,mid,high,n);
}
else {
return;
}
}
int main(void){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
sort(&a[0],0,n-1,n);
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
}
只看代码,复制返回循环需要修复:
for(i=low;i<=high;i++){
( *(a+(i )))=(*(b+(i ))); /* a+(i) not a+(l1) */
}
该代码并非真正基于指针,它只是使用了 a[i] 的替代语法,即 *(a+i)。对于基于指针的合并排序版本,low、mid、high 应该是指针,而不是索引。