回 帖 发 新 帖 刷新版面

主题:数组排序,字符串排序

[url=http://www.programfan.com/club/showbbs.asp?id=100474]这是以前发的关于文件排序[/url]

回复列表 (共5个回复)

沙发

数组排序,要注意数组的类型的配对,
针对不同的类型,在前面加一句DEFINT之类的就是了

SUB Sorta (s(), l%, h%)
IF l% < h% THEN
  IF h% - l% = 1 THEN
     IF s(l%) > s(h%) THEN SWAP s(l%), s(h%)
  ELSE
     r% = INT(RND * (h% - l% + 1)) + l%
     SWAP s(h%), s(r%)
     p = s(h%)
     i% = l%
     j% = h%
     DO
      DO WHILE (i% < j%) AND s(i%) <= p
         i% = i% + 1
      LOOP
      DO WHILE (j% > i%) AND 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
        Sorta s(), l%, i% - 1
        Sorta s(), i% + 1, h%
     ELSE
        Sorta s(), i% + 1, h%
        Sorta s(), l%, i% - 1
     END IF
  END IF
END IF
END SUB

板凳

字符串排序
u%为子串长度

SUB Sorts (s$, u%, l%, h%)
IF l% < h% THEN
  IF h% - l% = 1 THEN
     IF MID$(s$, l% * u% - u% + 1, u%) > MID$(s$, h% * u% - u% + 1, u%) THEN swaps s$, u%, l%, h%
  ELSE
     r% = INT(RND * (h% - l% + 1)) + l%
     swaps s$, u%, r%, h%
     p$ = MID$(s$, h% * u% - u% + 1, u%)
     i% = l%
     j% = h%
     DO
      DO WHILE (i% < j%) AND MID$(s$, i% * u% - u% + 1, u%) <= p$
         i% = i% + 1
      LOOP
      DO WHILE (j% > i%) AND MID$(s$, j% * u% - u% + 1, u%) >= p$
         j% = j% - 1
      LOOP
      IF i% < j% THEN swaps s$, u%, i%, j%
     LOOP WHILE i% < j%
     swaps s$, u%, i%, h%
     IF (i% - l%) < (h% - i%) THEN
        Sorts s$, u%, l%, i% - 1
        Sorts s$, u%, i% + 1, h%
     ELSE
        Sorts s$, u%, i% + 1, h%
        Sorts s$, u%, l%, i% - 1
     END IF
  END IF
END IF
END SUB

SUB swaps (s$, u%, l%, h%)
    w$ = MID$(s$, l% * u% - u% + 1, u%)
    MID$(s$, l% * u% - u% + 1, u%) = MID$(s$, h% * u% - u% + 1, u%)
    MID$(s$, h% * u% - u% + 1, u%) = w$
END SUB

3 楼


太复杂了,数组和字符串都可以直接用冒泡法或者选择法排序。简单实用效率高。

4 楼


可以用搜索(非正常)来改造;

5 楼

sub basesort(s(),lbounds%,ubounds%)       '毛跑法
  dim j%,k%
  do                                      '检测是否还要重排
    k=0                                   '重排旗帜归零
    for j% = %lbounds + 1 to ubounds%     '从第二个开始检查比上一个小?
      if s(j%)<s(j%-1) then
        swap s(j%),s(j%-1)
        k%=1
      end if
    next j
  loop while k
end sub

我来回复

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