注册 登录
编程论坛 新人交流区

[求助]纠错 冒泡法问题

hago 发布于 2007-11-04 10:13, 589 次点击
#include<stdio.h>
void maoposort(int a[],int n)
{
int i,j,t;
for(j=n;j>=1;j--)
{
for(i=1;i<=j-1;i++)
{
if (a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}

}
}
void main()
{
int array[10]={1,2,54,21,8,78,65,47,0,4},m;
maoposort(array,10);
for(m=1;m<=10;m++)
printf("%4d",array[m]);
}
我想用冒泡法排序的
为什运行结果却是0 2 4 8 21 47 54 65 78 575
为什么还会有 575
而1却不见了
哪位高手指导下 谢谢
11 回复
#2
酷儿2007-11-04 10:21

#include<stdio.h>
void maoposort(int a[],int n)
{
int i,j,t;
for(j=n;j>=1;j--)
{
for(i=0;i<=j-1;i++)
{
if (a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}

}
}
void main()
{
int array[10]={1,2,54,21,8,78,65,47,0,4},m;
maoposort(array,10);
for(m=1;m<=10;m++)
printf("%4d",array[m]);
}

数组下标由0开始

#3
作弊2007-11-04 10:40

2个问题
第一个问题是
for(i=1;i<=j-1;i++)
i 从1开始 那么 a[i] 是2 你的排序一开始就跳过了 a[0] 也就是没计算1

第二个问题是
if (a[i]>a[i+1])
在第一次运行for(j=n;j>=1;j--) 的时候
i+1 在最后一次 for(i=1;i<=j-1;i++) 循环中 变成了 j 超界了 这样 读取了一个数组之外的内存地址

建议修改成

for(i=0;i<=j-1;i++)

if ((a[i]>a[i+1])&&(i+1<j))

#4
作弊2007-11-04 10:41
建议初学 sorting 之类的用 java

那个会避免出现内存问题
#5
酷儿2007-11-04 10:43

建议修改成

for(i=0;i<=j-1;i++)

if ((a[i]>a[i+1])&&(i+1<j))



已经有了i=0,i<j-1还会越界吗??多余!!!

#6
hago2007-11-04 10:45

我明白啦 谢谢拉啊
但你给出的有点问题啊 我改过来了 能正常运行的
#include<stdio.h>
void maoposort(int a[],int n)
{
int i,j,t;
for(j=n-1;j>=0;j--)
{
for(i=0;i<=j-1;i++)
{
if (a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}

}
}
void main()
{
int array[10]={1,2,54,21,8,78,65,47,0,4},m;
maoposort(array,10);
for(m=0;m<=9;m++)
printf("%4d",array[m]);
}

#7
作弊2007-11-04 10:56
i最后是等于 j-1的

而a[i+1] 相当于 a[j-1+1]

第一次的 j=n 那就是 a[n]

n是10 自然 越界了
#8
zzj9362007-11-04 11:04
学习了,谢谢
#9
酷儿2007-11-04 20:29

谢谢,指出错误啊
我又看了一下,我那个在运行时没错误,是上面的越界和下面的输出正好抵消.

#10
xiubing03772007-11-05 11:05
#11
it的脚本小孩2007-11-05 12:59
include<stdio.h>
void maoposort(int a[],int n)
{
int i,j,t;
for(j=n;j>0;j--)
{
for(i=0;i<=j-1;i++)
{
if (a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}

}
}
void main()
{
int array[11]={1,2,54,21,8,78,65,47,0,4},m;
maoposort(array,10);
for(m=1;m<=10;m++)
printf("%4d",array[m]);
}


两个错误:越界,应从0开始
#12
gouki2007-11-05 14:39
......冒泡排序都会这么累。
1