回 帖 发 新 帖 刷新版面

主题:数组元素移动相关的问题

编程:
    假设有以下数据有序地存放在一维数组中,请将加下划线的数据作如下移动:
           10 11 [b]12 13 14 15 [/b]16 17 18 19
           10 11 16 17 18 19 [b]12 13 14 15[/b] 

     此题编程思路采用多次逆置数据的方法,即逆置A(3)到A(6)中的数,接着逆置A(7)至A(10)中的数,最后逆置A(3)到A(10)中的数,本题共做了三次逆置.
     移动的部分程序段:
     REM 三次逆置数据
     for i=1 to 3
         read l,h
         while l<h
             swap a(l),a(h)
             l=l+1:h=h-1
         wend
     next k
     这题的解法,是一本资料上介绍的,可以作为一种方法,但我却觉得它可以解决问题但很烦琐,也不易想,是不是移动的问题,这种方法就是一种最好的方法呢.

   我想的方法是,直接交换:A(3)和A(7),A(4)和A8),A(5)和A(9),A(6)和A(10)共交换四次
    移动的程序段为:
    for i=3 to 6
        swap a(i),a(i+4)
    next i

    我觉得还是第二种方法好想,好用,而逆置的方法不是顺思维就能想到的,解决一般移动问题,逆置真有点麻烦.
    想请教,在移动中介绍逆置的方法主要的目的和应用范围是什么?
     

回复列表 (共4个回复)

沙发

1. 我没看明白你的逆置理论:
     A>. read 的数据data在哪里没看见
     B>. for i.....next k 也没看明白
2. .....

板凳

(刚才领导叫去开会了,抱歉)

(不同的语言有不同的处理方法.在我们这里只讲QB吧,其他语言的便利我们不眼红)

2. 楼主的方法是最简明方便的办法,
   构成: 两个起点一个长度.

3. 在数组置换的方法里,当数组巨大,交换操作频繁的时候,会浪费很多的时间:
   在楼主的循环里: 
   寻址:找两个某数组元素变量的地址,
   交换:把两个地址的值传到寄存器中,作交换操作
   当循环次数很大的时候,这些操作会浪费一些时间.
   
   这个时候,我们就要学学C的做法了.-从内存着手,
   1> 找到数组两个起点的内存地址,
   2> 把其中一段数据A保存起来,
   3> 把另一段数据B复制到这个位置上覆盖原数据A.
   4> 把已保存的中间数据覆盖到后一段数据B的位置去, 完成替换

4. 内存操作的方法也有很多种,辨其利弊而用.
   1> Bsave, Bload 这个方法最好用在有虚拟磁盘的系统上,
      因为它是对文件进行操作,真实的磁盘文件也要耗费时间,
      用内存虚拟的文件系统就快得多了.
   2> seek,poke,peek 这个方法跟数组下标替换原理相同,但因为是直接内存操作,所以要快上一点.
   3> 字符串模拟数组,因为字符串有mid$( )函数和语句,截段替换相对来说要快得多,
      只是下标运算使用起来会比数组略有繁琐.总体看来我还是比较喜欢字符串处理

5. 我记得以前讨论过这个问题,应该还有其他办法和细节的,
   但我一时想不起来了,如果能翻得出来再说吧.

3 楼

对不起,由于当时匆忙,没有写上DATA语句,现把逆置语句给写全,如下:
     dim a(10)
     for i=1 to 10
       read a(i)
     next i
     REM 三次逆置数据
     for i=1 to 3
         read l,h
         while l<h
             swap a(l),a(h)
             l=l+1:h=h-1
         wend
     next k
     REM 输出数据
     for i=1 to 10
         print a(i);
     next i
     data 10,11,12,13,14,15,16,17,18,19
     data 3,6,7,10,3,10
     end

     此程序中用了三次逆置:即逆置A(3)到A(6)中的数,接着逆置A(7)至A(10)中的数,最后逆置A(3)到A(10)中的数.最后达到移动的目的.
     我对此题方法是理解的,但不明白的是既然有第二种较为简单,又好想的方法,为什么要用这么麻烦,又不太好想的逆置方法呢,而逆置方法同样要交换,而且交换的次数还此方法二的交换次数要多,就不知道它作为移动的一种方法优势何在???

4 楼

是的,你看得很清楚,
只要能验证效果的,要相信自己的眼睛(哪怕只是暂时的)
在这个地方,很明显的,直接交换比所谓的逆置高效省事得多,
他那样做简直就是脱什么放什么多此一举.
那样的逆置,只在倒排有优势.

我来回复

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