c语言冒泡法升序排列20个数字遇到的问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 05:17:33
这是我自己写的
"冒泡法升序排列20个数字遇到的问题"
每次已运行就提示 内存无法write ..是怎么回事。。请教高手。。
#include "stdio.h"
void main()
{ int i,j,a[20],tmp;
for (i=1;i<=20;i++)
{ printf("请输入第%d个数字:",i);
scanf("%d",a[i]);
}
for(i=1;i<=20;i++)
{ for(j=1;j<=20;j++)
{if(a[j]>=a[j+1])
{ tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(i=1;i<=20;i++)
printf("%d",a[i]);}

首先,scanf里面赋值的参数要是地址而不是值,也就是你该写成&a[i]
然后就是数组下标是从0开始到元素个数减1,你定义的是20,下标就是0-19,不存在20这个下标,而你所有用的都是1-20,这是个基本概念

最后就是,冒泡排序比较次数是n-1,也就是说每一次都是那当前的数和下一数比,那么也就是到了倒数第二个和最后一个比就完成了比较,比较过程循环变量不应该出现最后一个下标,你的20个元素,应该最后是18和19比较,而你到20在比较,就溢出了

改后程序如下:
#include "stdio.h"
void main()
{ int i,j,a[20],tmp;
for (i=0;i<20;i++)
{ printf("请输入第%d个数字:",i);
scanf("%d",&a[i]);
}
for(i=0;i<20-1;i++)
{ for(j=0;j<20-1;j++)
{if(a[j]>=a[j+1])
{ tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(i=0;i<20;i++)
printf("%d",a[i]);}

给你修改了一下
#include "stdio.h"
void main()
{ int i,j,a[20],tmp;
for (i=0;i<20;i++)
{ printf("请输入第%d个数字:",i);
scanf("%d",&a[i]);
}
for(i=0;i<20;i++)
{ for(j=;j<20-i;j++)
{if(a[j]>=a[j+1])
{ tmp=a[j];
a[j]=a[j+1];
a