我的冒泡法怎么会1变10呢?

软件和网站开发以及相关技术探讨
回复
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

我的冒泡法怎么会1变10呢?

#1

帖子 timebomb » 2009-03-13 18:59

望各位路过的能停留1分钟看看我的小小小程序。。。

代码: 全选

//创建一个数组,然后分别利用选择法和冒泡法对数组进行排序。

#include <stdio.h>

#define NUMBER 10

void xuanzefa(int a[],int n);
void maopaofa(int a[],int n);

main()
{
	int a[NUMBER],i;
	
	printf("Please enter the number of the shuzu:\n");
	for(i=0;i<NUMBER;i++)
		scanf("%d",&a[i]);

	xuanzefa(a,NUMBER);
	printf("xuzefa->:\n");
	for(i=0;i<NUMBER;i++)
		printf("%d\t",a[i]);

	maopaofa(a,NUMBER);
	printf("\nmaopaofa->:\n");
	for(i=0;i<NUMBER;i++)
		printf("%d\t",a[i]);

	printf("\n");
	return 0;
}

void xuanzefa(int a[],int n)
{
	int temp,i,j,k;

	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
			if(a[j] < a[k])		k=j;
		if(k != i)
		{	temp=a[i]; a[i] = a[k];a[k] = temp;}
	}
}

void maopaofa(int a[],int n)
{
	int temp,i,j;
	for(i=0;i<n;i++)
	{	for(j=0;j<n-i;j++)
			if(a[j] <a[j+1])
				{temp=a[j]; a[j] = a[j+1];a[j+1] = temp;}
	}
}
希望大家给我看看,我每次运行如果输入一般的数都没有问题,但是每当输入1这个数的时候1会自动变为10。为什么呢? :em01
谢谢。。。。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 我的冒泡法怎么会1变10呢?

#2

帖子 BigSnake.NET » 2009-03-13 19:05

没有啊
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
SethVerlo
帖子: 9
注册时间: 2009-01-30 21:29

Re: 我的冒泡法怎么会1变10呢?

#3

帖子 SethVerlo » 2009-03-15 18:23

你这冒泡写的有点太繁琐了...
我给你个pascal版的吧...
原来学竞赛的时候写的...应该问题不大...

for i:=1 to n do //n个数
for j:=1 to n do
if a>a[j] then
begin
temp:=a; //temp是临时变量
a:=a[j];
a[j]:=temp;
end;
SethVerlo
帖子: 9
注册时间: 2009-01-30 21:29

Re: 我的冒泡法怎么会1变10呢?

#4

帖子 SethVerlo » 2009-03-15 18:24

对了顺便说一下...
感觉你的问题在#define NUMBER 10上...
只是感觉...第一眼看这句就有很不顺的感觉...
头像
greco
帖子: 2487
注册时间: 2007-04-06 10:24
来自: ~/Shanghai

Re: 我的冒泡法怎么会1变10呢?

#5

帖子 greco » 2009-03-15 18:35

SethVerlo 写了:对了顺便说一下...
感觉你的问题在#define NUMBER 10上...
只是感觉...第一眼看这句就有很不顺的感觉...
很敏锐的洞察力

虽然我也没看程序
http://silenceisdefeat.com/~greco

代码: 全选

''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

Re: 我的冒泡法怎么会1变10呢?

#6

帖子 timebomb » 2009-03-16 13:10

先谢谢您的回复。。。
SethVerlo 写了:你这冒泡写的有点太繁琐了...
我给你个pascal版的吧...
原来学竞赛的时候写的...应该问题不大...

for i:=1 to n do //n个数
for j:=1 to n do
if a>a[j] then
begin
temp:=a; //temp是临时变量
a:=a[j];
a[j]:=temp;
end;


小弟刚刚出道,不大清楚你的“pascal”什么东东,(刚刚查了:“IOI(国际奥林匹克信息学竞赛)把Pascal语言作为三种程序设计语言之一, NOI(全国奥林匹克信息学竞赛)把Pascal语言定为唯一提倡的程序设计语言,在大学中Pascal语言也常常被用作学习数据结构与算法的教学语言。 ”感觉你好牛,竟然可以参加这种比赛)。可是是说的看到我的“#define NUMBER 10”有问题,什么问题呢?我实在是感觉不出来,有什么不对的那我的选择法还是可以正常运行的啊。还有二楼,我是在Ubuntu下用gcc -o data data.c编译运行的,到现在还是不可以,难道是我的电脑的事,应该不是吧。

还可以帮我一下么???
上次由 timebomb 在 2009-03-21 14:55,总共编辑 1 次。
qakito
帖子: 9
注册时间: 2008-01-28 15:54

Re: 我的冒泡法怎么会1变10呢?

#7

帖子 qakito » 2009-03-16 13:55

在VC和GCC下分别测试了LZ的代码,并没有碰到LZ的问题……
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

Re: 我的冒泡法怎么会1变10呢?

#8

帖子 timebomb » 2009-03-17 7:25

回去我再把文件放到其他的文件夹运行下试试,咋会这样呢,我找过一个编程msn好友,他第一次运行的时候也是出现了我的情况,但是改天自己又运行了几次竟然刚开始还是1变10.后来却又好了。奇怪了。。。呵呵,

先谢谢各位 :em11
头像
wuqi
帖子: 88
注册时间: 2009-01-23 13:35
来自: 武汉

Re: 我的冒泡法怎么会1变10呢?

#9

帖子 wuqi » 2009-03-17 9:44

timebomb 写了: 我是在Ubuntu下用gcc -o data.c data编译运行的,到现在还是不可以,难道是我的电脑的事,应该不是吧。

还可以帮我一下么???
好像是gcc data.c -o data 吧 :em11
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

Re: 我的冒泡法怎么会1变10呢?

#10

帖子 timebomb » 2009-03-17 12:24

wuqi 写了:
timebomb 写了: 我是在Ubuntu下用gcc -o data.c data编译运行的,到现在还是不可以,难道是我的电脑的事,应该不是吧。

还可以帮我一下么???
好像是gcc data.c -o data 吧 :em11

这个无所谓的,效果都是一样的 :em11
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

Re: 我的冒泡法怎么会1变10呢?

#11

帖子 timebomb » 2009-03-17 12:28

qakito 写了:在VC和GCC下分别测试了LZ的代码,并没有碰到LZ的问题……

我把它放到别的新文件夹运行还是不行呢 :em20
还是出现老问题,只要输入1,那么冒泡法就会变成10。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 我的冒泡法怎么会1变10呢?

#12

帖子 BigSnake.NET » 2009-03-17 13:47

$ ./a.out
Please enter the number of the shuzu:
4 2 1 4 0 2 3 1 4 9
xuzefa->:
0 1 1 2 2 3 4 4 4 9
maopaofa->:
9 4 4 4 3 2 2 1 1 0
完全没有 LZ 所说的情况
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
tianyaqu
帖子: 97
注册时间: 2008-12-05 20:43
来自: 深圳

Re: 我的冒泡法怎么会1变10呢?

#13

帖子 tianyaqu » 2009-03-21 13:39

哈哈 搂住打字时错了 我反复实验 发现问题出在冒泡法上:在第二重FOR循环时 for (j=0;j<n-i;j++) !!!里面的i-1因该是n-1!!该过来就好了。。。
另外闲暇之余,我按照timebomb同学所说 gcc -o ab.c ab //我的文件名是ab.c 并且当前目录下有 编译好ab 和 ab.c两个文件
结果是 没编译出来反而把我的 ab.c给删除了,ab没变还是上一次的ab ,,郁闷中 。。下面是代码 大家给分析下

代码: 全选

ab: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o:(.text+0x0): first defined here
ab:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o:(.rodata+0x0): first defined here
ab: In function `_fini':
/build/buildd/glibc-2.8~20080505/build-tree/glibc-20080505/csu/../sysdeps/generic/initfini.c:109: multiple definition of `_fini'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crti.o:/build/buildd/glibc-2.8~20080505/build-tree/glibc-20080505/csu/../sysdeps/generic/initfini.c:109: first defined here
ab:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
ab: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o:(.data+0x0): first defined here
ab: In function `__data_start':
(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/i486-linux-gnu/4.3.2/crtbegin.o:(.data+0x0): first defined here
ab: In function `_init':
/build/buildd/glibc-2.8~20080505/build-tree/i386-libc/csu/crti.S:15: multiple definition of `_init'
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crti.o:/build/buildd/glibc-2.8~20080505/build-tree/i386-libc/csu/crti.S:15: first defined here
/usr/lib/gcc/i486-linux-gnu/4.3.2/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
ab:(.dtors+0x4): first defined here
collect2: ld 返回 1
道是何物,直教,生死相许?
头像
timebomb
帖子: 153
注册时间: 2008-04-09 11:01

Re: 我的冒泡法怎么会1变10呢?

#14

帖子 timebomb » 2009-03-21 15:36

tianyaqu 写了:哈哈 搂住打字时错了 我反复实验 发现问题出在冒泡法上:在第二重FOR循环时 for (j=0;j<n-i;j++) !!!里面的i-1因该是n-1!!该过来就好了。。。
另外闲暇之余,我按照timebomb同学所说 gcc -o ab.c ab //我的文件名是ab.c 并且当前目录下有 编译好ab 和 ab.c两个文件
结果是 没编译出来反而把我的 ab.c给删除了,ab没变还是上一次的ab ,,郁闷中 。。下面是代码 大家给分析下
谢谢这位兄弟,实在是感谢。呵呵。找到原因了。。。 :em11
1、我的冒泡法确实存在问题,而且是第二重for循环里面。应该是for (j=0;j<n-i-1;j++) ,因为第一次进入第二重for循环一直到j=8,交换a[8]a[9]后进入下一个循环就会出现非法的a[10]!因为我的循环允许j=9,当j=9再比较的时候就有了j+1=10。问题就是出现了数组溢出的现象。如果改成楼上所说的,倒是也可以找到正确的答案,但是违背了冒泡法的初衷,就是每一次二重for循环都要运行9次,这是没有必要的,因为毕竟你后面的已经排好了。如果数据多的话会浪费资源的。

2、楼上说的gcc -o ab.c ab 是我的疏忽,我在上面已经改正过来了。因为看的一个教程说是这样书写也是对的,但是我打错了。应该是gcc -o ab ab.c前面是你要编译成的文件名,后面是你要编译的文件名。

3、再次向上面的同志表示感谢。谢谢大家……
头像
tianyaqu
帖子: 97
注册时间: 2008-12-05 20:43
来自: 深圳

Re: 我的冒泡法怎么会1变10呢?

#15

帖子 tianyaqu » 2009-03-22 17:22

哈哈 我是新手哦 相互学习哈
道是何物,直教,生死相许?
回复