主题:用QB仿 DOS 的 SORT 对文件排序
moz
[专家分:37620] 发布于 2005-08-25 13:13:00
DOS 里的 SORT 用的是输入输出重定向符号,
重定向输出很简单,只是需要把自已显示避开输出,得写内存去,
加上输入不懂,算了,放弃这个符号
SORT 还支持命令输入输出的数据处理,
我不知道它的位置在哪,又算了,再放弃.
无法和 DOS 的 SORT 作比较,
我在测试过程中对一个比较大的文件作排序
12000 多行,长度超过 6M
用 SORT2 花了三分钟( DOS 6.22 , PI , 16M )
用 SORT 提示内存不足
我还加了一些屏幕显示,不知道有没有妨碍系统速度
排序用的是动态快速排序(是不是还有很多其他的名字?)
基本操作都是对文件内容的读写比较耗时
因为数组的限制原因,最多只能处理 16K 行以内的文件
源代码在下面:
回复列表 (共6个回复)
沙发
moz [专家分:37620] 发布于 2005-08-25 13:17:00
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
板凳
莫非白 [专家分:750] 发布于 2005-08-25 14:42:00
晕得紧`````~~~~[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 楼
def [专家分:3380] 发布于 2005-08-28 21:09:00
得法。德望法,合法渴望棵;:呢温度计能否伟大饿恶毒是
!@#$ %^ "&&!@#$ %^#@*%()!$ (&_@*+$ ~?!({%$ #@&#&
....................................
妈妈摸哦欧洲政治
默默欧洲子
末子(moz)
4 楼
Matodied [专家分:7560] 发布于 2007-05-02 21:41:00
3楼,你发的什么东西?
5 楼
Matodied [专家分:7560] 发布于 2007-05-04 21:04:00
我知道3楼打的是什么了(不过他在智能ABC里输入的):
def.dewf,hefkewk;:newdjnfwd'eds
1234 56 '771234 5632859014 97-28=4 `/19[74 32787
...................................
mmmooozzz
mmoozz
moz
6 楼
Rick0ne [专家分:1490] 发布于 2007-05-05 00:31:00
外部排序,QuickSort不太适合,它的空间复杂度也是O(nlogn),而且占栈资源(如果用递归实现的话)
我来回复