主题:麻烦帮我用简单的方法给a,b,c,d排序
tzhb2008
[专家分:0] 发布于 2005-12-08 00:16:00
输入a,b,c,d 要求按从大到小输出, 我老是出错,请各位前辈同人帮下忙.
我只会求a,b,c的排序问题,4个的我就不知道哪里错了~
回复列表 (共8个回复)
沙发
moz [专家分:37620] 发布于 2005-12-08 11:02:00
if b>a then swap a,b
if c>a then swap a,c
if d>a then swap a,d
if c>b then swap b,c
if d>b then swap b,d
if d>c then swap c,d
板凳
31117 [专家分:0] 发布于 2005-12-13 22:35:00
dim a(4) as integer
for i = 1 to 4
input x
a(i)=x
next i
for m = 1 to 3
for n = 1 to 4-m
if a(n)<a(n+1) then swap a(n),a(n+1)
next n
next m
for j = 1 to 4
print a(j);
next j
end
3 楼
喜欢QB [专家分:200] 发布于 2005-12-14 19:42:00
DIM sz$(1 TO 4)
FOR a=1 to 4
INPUT sz$(a) ‘输入数字,存入数组
NEXT a
FOR a=1 TO 3
FOR b=a+1 TO 4
IF sz$(a)<sz$(b) THEN SWAP sz$(a),sz$(b) ’数字从大到小排序
NEXT b
NEXT a
FOR a=1 TO 4
PRINT sz$(a);" "; ‘数字显示
NEXT a
4 楼
zhangyang9007 [专家分:80] 发布于 2006-01-20 11:12:00
如果是三个的话,可以这样做(从小到大)
input a,b,c
if a>b then swap a,b
if b>c then swap b,c
if a>c then swap a,c
print a,b,c
end
如果是三个(n>3)以上,那只能用排序法,最常用的是一般选择法
input n
dim a(1 to n) as integer
for i=1 to n
input a(i)
next i
for i=1 to n-1
for j=i+1 to n
if a(i)>a(j) then swap a(i),a(j)
next j
next i
for i=1 to n
print a(i);
next i
end
5 楼
programlove [专家分:30] 发布于 2006-01-23 18:36:00
转贴:
排序方法通俗讲解之“壳”法这篇文章不需要任何编程或数学基础,只要你能认识这篇文章中的每一个字,而且认识扑克牌,就能够读懂。今天我见到别人写的一篇文章,一篇关于排序方法的文章。也许大家过去听到过冒泡法、交换法之类,也许有的大侠还见过QBasic45附带的关于排序方法的程序(彩条排序程序)。今天讲的是一种叫做“壳(Shell)”的方法——我很久以前就实践过,但今天头一次知道它的名字。十分简单,这里没有任何代码。首先准备一套扑克牌。挑出从1到10的一把牌。 “壳”法就是依次比较相隔一定距离的两张牌的大小,然后根据它们之间的大小来决定是否交换。比如说: 10 9 8 7 6 5 4 3 2 A 10和6之间的距离,我们就说是4吧。 “依次”指的就是先比较10和6,再比较9和5,然后8和4,以此类推。好了,我们现在把这一列牌按由小到大排列。先以4为距离,依次比较一下,如果左大右小,就交换这两张牌。交换10和6,9和5,8和4,7和3,10和2,9和A之后得到 6 5 4 3 2 A 8 7 10 9 别着急,这才只是第一步。现在我们以3为距离再来一次。交换6和3,5和2……之后得到 3 2 A 6 5 4 8 7 10 9 接着来,以2为距离再来一次。交换后得到 A 2 3 4 5 6 8 7 10 9 最后,相邻的两个数比较后交换:得到 A 2 3 4 5 6 7 8 9 10 大概的方法大家已经看到了:只要以某个数作为距离比较交换,然后依次按更小的数字来做为距离交换就可以了。但第一个距离数字应该去多少呢?大家注意,我们刚才举的例子是一种最糟糕的情况——完全反序。在排列很多个数字时,我们也要设想类似的最糟糕的情况。 10 - - - - - - - - - 我们把目光定位在10上。第一波距离为4,10会向后移动4格;第二波距离为3,10会向后移动3格……就是说,这个10跳过的这几步距离,应该保证10 有能力跳到最后一个格上。而从第一个格到第十个格距离为9,那么只要1+2+3+……+n>=9就行了。 1+2+3=6<9,不符合条件; 1+2+3+4=10>=9,符合条件。所以第一波距离应为4。大家试一试从A到K的一把牌,验证一下。
6 楼
moz [专家分:37620] 发布于 2006-01-23 18:59:00
你认为这与冒泡法相差多少?
7 楼
sungfeng21 [专家分:330] 发布于 2006-02-07 07:50:00
对字母排序可以先将其转换为ASCLL码再进行排序,然后再转换为字母即可
8 楼
moz [专家分:37620] 发布于 2006-02-07 10:54:00
转换就没必要了。
但这种方法的确比冒泡法要节省一些比较要快一些。
defint a-z
L=10
dim a(L)
print
for i=1 to L
a(i)=L-i+1
print a(i);
next
for i=sqr(L*2) to 1 step -1
for j=1 to L-i
if a(j)>a(i+j) then swap a(j),a(i+j)
next j,i
print
for i=1 to L
print a(i);
next
------------------------------------------------------
冒泡法的循环比较次数是
((L-1)+ 1)*(L-1)/2 当L=10时需要比较45次(暂不计交换次数)
这种“Shell”法的比较次数是
((L-1)+(L-sqr(L*2))*sqr(L*2)/2 当L=10时需要比较30次
我来回复