回 帖 发 新 帖 刷新版面

主题:用QB仿 DOS 的 SORT 对文件排序

DOS 里的 SORT 用的是输入输出重定向符号,
重定向输出很简单,只是需要把自已显示避开输出,得写内存去,
加上输入不懂,算了,放弃这个符号

SORT 还支持命令输入输出的数据处理,
我不知道它的位置在哪,又算了,再放弃.

无法和 DOS 的 SORT 作比较,
我在测试过程中对一个比较大的文件作排序
12000 多行,长度超过 6M
用 SORT2 花了三分钟( DOS 6.22 , PI , 16M )
用 SORT 提示内存不足

我还加了一些屏幕显示,不知道有没有妨碍系统速度
排序用的是动态快速排序(是不是还有很多其他的名字?)
基本操作都是对文件内容的读写比较耗时
因为数组的限制原因,最多只能处理 16K 行以内的文件

源代码在下面:

回复列表 (共6个回复)

沙发

DECLARE SUB Jindu (b!)
DECLARE SUB QuickSort (l%, h%)
DECLARE FUNCTION fs$ (d&)

a$ = COMMAND$
maxs% = 16000
DIM SHARED s&(maxs%), r%, n%, m%, l%
IF INSTR(a$, "/?") OR INSTR(a$, "/H") THEN
PRINT "SORT [/R] [/+n] [drive1:][path1]filename1 [[drive2:][path2]filename2]"
PRINT "/R           反向排序; 就是按从 Z 到A,从 9 到 0 的顺序排序.          "
PRINT "/+n          按第 n 列字母顺序排列文件顺序.                          "
PRINT "[drive1:][path1]filename1  指定被排序的文件.                         "
PRINT "[drive2:][path2]filename2  指定一个文件储存排序的结果.               "
PRINT "暂不支持命令输出方式及定重向输入输出方式.                            "
SYSTEM
END IF

IF INSTR(a$, "/R") THEN r% = 1
i% = INSTR(a$, "/+")
j% = INSTR(i% + 1, a$, CHR$(32))
IF i% > 0 AND j% > 0 THEN n% = VAL(MID$(a$, i% + 2, j% - i% - 2))

i% = INSTR(a$, "/")
DO WHILE i%
l% = LEN(a$)
FOR j% = i% TO l%
    IF MID$(a$, j%, 1) = CHR$(32) OR j% = l% THEN
       a$ = LEFT$(a$, i% - 1) + MID$(a$, j% + 1)
       EXIT FOR
    END IF
NEXT
i% = INSTR(a$, "/")
LOOP
a$ = RTRIM$(LTRIM$(a$))

i% = INSTR(a$, " ")
IF i% = 0 THEN
   f1$ = a$
   f2$ = f1$
ELSE
   f1$ = RTRIM$(LEFT$(a$, i% - 1))
   f2$ = LTRIM$(MID$(a$, i% + 1))
END IF

IF DIR$(f1$) = "" OR f1$ = "" THEN
   PRINT "源文件:< "; f1$; " >不存在,无法排序."
   SYSTEM
ELSEIF DIR$(f2$) <> "" THEN
   PRINT "是否覆盖源文件:< "; f2$; " >  <Y> "
   IF UCASE$(INPUT$(1)) <> "Y" THEN SYSTEM
END IF

PRINT " // 源文件:"; f1$; " // 目标文件:"; f2$;
IF r% THEN PRINT " // 倒序";
IF n% THEN PRINT " // 排第"; n%; "列"
IF f2$ = f1$ THEN
   s% = 1
   MID$(f2$, 1, 1) = "~"
END IF

OPEN f1$ FOR BINARY AS #1
s&(1) = 1
m% = 1
l% = 1
c& = LOF(1)
crlf$ = CHR$(13) + CHR$(10)
b$ = " "
DO UNTIL EOF(1)
   b$ = RIGHT$(b$, 1) + INPUT$(16380, 1)
   DO
     i& = INSTR(i& + 1, b$, crlf$)
     IF i& > 0 THEN
      k& = i& + j& + 1
      IF k& < c& THEN
         m% = m% + 1
         IF m% > maxs% THEN
            PRINT "文件中行数过多,无法处理排序."
            CLOSE
            SYSTEM
         END IF
         s&(m%) = k&
         IF s&(m%) - s&(m% - 1) > l% THEN l% = s&(m%) - s&(m% - 1)
      END IF
     END IF
   LOOP WHILE i&
   j& = j& + 16380
LOOP
l% = l% - n%
IF n% = 0 THEN n% = 1
COLOR 14, 0

QuickSort 1, m%

CLOSE #1

IF r% > 0 THEN
   i1% = m%
   i2% = 1
   i3% = -1
ELSE
   i1% = 1
   i2% = m%
   i3% = 1
END IF

OPEN f1$ FOR INPUT AS #1
OPEN f2$ FOR OUTPUT AS #2
FOR i% = i1% TO i2% STEP i3%
    SEEK #1, s&(i%)
    LINE INPUT #1, w$
    PRINT #2, w$
    k% = k% + 1
    Jindu k% / m%
NEXT
CLOSE #1, #2
Jindu 1
IF s% = 1 THEN
   KILL f1$
   NAME f2$ AS f1$
END IF

FUNCTION fs$ (d&)
SEEK #1, d& + n% - 1
fs$ = INPUT$(l%, 1)
END FUNCTION

SUB Jindu (b)
  COLOR 16, 6
  LOCATE , 1
  a$ = "  正在写新文件, 已完成" + STR$(INT(b * 100)) + "%  请稍候....." + SPACE$(50)
  PRINT LEFT$(a$, 50 * b);
  COLOR 7, 1
  PRINT MID$(a$, 50 * b + 1, 50 - 50 * b);
  COLOR 7, 0
END SUB

SUB QuickSort (l%, h%)
  PRINT ".";
IF l% < h% THEN
  IF h% - l% = 1 THEN
     IF fs$(s&(l%)) > fs$(s&(h%)) THEN SWAP s&(l%), s&(h%)
  ELSE
     r% = INT(RND * (h% - l% + 1)) + l%
     SWAP s&(h%), s&(r%)
     p$ = fs$(s&(h%))
     i% = l%
     j% = h%
     DO
      DO WHILE (i% < j%) AND (fs$(s&(i%)) <= p$)
         i% = i% + 1
      LOOP
      DO WHILE (j% > i%) AND (fs$(s&(j%)) >= p$)
         j% = j% - 1
      LOOP
      IF i% < j% THEN SWAP s&(i%), s&(j%)
     LOOP WHILE i% < j%
     SWAP s&(i%), s&(h%)
     IF (i% - l%) < (h% - i%) THEN
        QuickSort l%, i% - 1
        QuickSort i% + 1, h%
     ELSE
        QuickSort i% + 1, h%
        QuickSort l%, i% - 1
     END IF
  END IF
END IF
LOCATE ,POS(0)-1
PRINT SPACE$(1);
LOCATE,POS(0)-1
END SUB

板凳

晕得紧`````~~~~[em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10][em10]

3 楼

得法。德望法,合法渴望棵;:呢温度计能否伟大饿恶毒是
!@#$  %^ "&&!@#$ %^#@*%()!$ (&_@*+$ ~?!({%$ #@&#&
....................................
妈妈摸哦欧洲政治
默默欧洲子
末子(moz)

4 楼

3楼,你发的什么东西?

5 楼

我知道3楼打的是什么了(不过他在智能ABC里输入的):
def.dewf,hefkewk;:newdjnfwd'eds
1234  56 '771234 5632859014 97-28=4 `/19[74 32787
...................................
mmmooozzz
mmoozz
moz

6 楼

外部排序,QuickSort不太适合,它的空间复杂度也是O(nlogn),而且占栈资源(如果用递归实现的话)

我来回复

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