回 帖 发 新 帖 刷新版面

主题:麻烦帮我用简单的方法给a,b,c,d排序

输入a,b,c,d 要求按从大到小输出, 我老是出错,请各位前辈同人帮下忙.
我只会求a,b,c的排序问题,4个的我就不知道哪里错了~

回复列表 (共8个回复)

沙发

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

板凳

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 楼

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 楼

如果是三个的话,可以这样做(从小到大)
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 楼

转贴:


排序方法通俗讲解之“壳”法这篇文章不需要任何编程或数学基础,只要你能认识这篇文章中的每一个字,而且认识扑克牌,就能够读懂。今天我见到别人写的一篇文章,一篇关于排序方法的文章。也许大家过去听到过冒泡法、交换法之类,也许有的大侠还见过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 楼

你认为这与冒泡法相差多少?

7 楼

对字母排序可以先将其转换为ASCLL码再进行排序,然后再转换为字母即可

8 楼

转换就没必要了。
但这种方法的确比冒泡法要节省一些比较要快一些。

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次

我来回复

您尚未登录,请登录后再回复。点此登录或注册