Board logo

标题: [数值计算] [已解决]批处理怎样实现数值排序处理? [打印本页]

作者: guaiwu    时间: 2011-9-8 23:49     标题: [已解决]批处理怎样实现数值排序处理?

本帖最后由 guaiwu 于 2011-9-14 23:48 编辑
  1. setlocal enabledelayedexpansion
  2. for /f %%i in (22.txt) do (
  3. set /a n+=1
  4. for /f "skip=!n!" %%a in (22.txt) do (
  5. set m=%%a
  6. for /f %%b in (22.txt) do (
  7. if !m! gtr %%b (set x=!m!)
  8. )
  9. echo !x!
  10. ))
  11. pause
复制代码
22.txt
  1. 4100
  2. 100
  3. 555000
  4. 1313
  5. 56565984
  6. 131389949
复制代码
求解skip=n,n不能是变量吗。  头都大了

需求:想要实现22.txt文档中数值按gtr排序。希望能照着次代码的思路做下去,我不想断了自己这段代码、
作者: bluewing009    时间: 2011-9-9 00:12

想写冒泡排序么?sort命令?
作者: 545810831    时间: 2011-9-9 08:59

按照楼主代码思路只能找到最大值或最小值,
作者: wc726842270    时间: 2011-9-9 09:14

LZ是想升序(ASC)么?如果有兴趣看一下我写的 http://www.bathome.net/thread-13976-1-1.html
利用了ASCII字符表,进行了适当的极值,只要知道最大值的位数和最小的就差不多了
作者: 冷玉公子    时间: 2011-9-9 10:23

批处理通用排序代码,大家来看哦。
http://www.bathome.net/viewthread.php?tid=13997&extra=

楼主的题我拿出来演示了 哈哈
作者: 冷玉公子    时间: 2011-9-9 10:24

  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. @Rem 关闭回显并打开变量延迟
  3. Set /P Var_Filepach=请讲要处理的文件,拖入此框中。
  4. @Rem 这个我觉得不用作解释吧 哈哈
  5. @Rem 检测要处理文件的行数,并将每一行赋值于一个数组中。
  6. For /f %%a in (%Var_Filepach%) do (
  7. Set /a NumValue+=1
  8. Set "StrLine!NumValue!=%%a"
  9. )
  10. @Rem 处理过程 具体看下面的注释
  11. For /l %%z in (1,1,%NumValue%) do (
  12. @Rem 第一个For循环,循环次数为文本的总行数。
  13. For /l %%a in (1,1,%NumValue%) do (
  14. @Rem 第二个循环,循环次数为文本的总行数,其实是为第一次排序。
  15. For /f "tokens=* delims=." %%b in ("!StrLine%%a!") do Set StrLineNumValueA=%%b
  16. @Rem 找出排序依序值,本例中处理的是C类IP地址。所以取的值为最后一个IP地址.
  17. Set "Var_Stepvalue=%%a"
  18. Set /a Var_Stepvalue+=1
  19. If !Var_Stepvalue! GEQ %NumValue% Set Var_Stepvalue=%NumValue%
  20. @Rem 这个IF只是用来限制判断行数不能超出最大的行数
  21. Echo !Var_Stepvalue! > %Temp%\Temp
  22. @Rem 因批处理没有办法或者说本人还没有发现更好的方法来实现真正的数组,所以只能利用局部变量来代替数组编号。
  23. @Rem 所以将这个位置的值用所需要的值,加1然后输出到一个文本中。方便让下一个For来将其作为局部变量来使用
  24. For /f %%b in (%Temp%\Temp) do (
  25. @Rem 读取所需要的数组代号并赋值于局部变量%%b
  26. For /f "tokens=* delims=." %%b in ("!StrLine%%b!") do Set StrLineNumValueB=%%b
  27. @Rem 提取出于第一个数值做比较的第二个数值
  28. If !StrLineNumValueA! GTR !StrLineNumValueB! (
  29. @Rem 判断第二个数值是否大于第一个数值
  30. Set "StrLineT=!StrLine%%a!"
  31. Set "StrLine%%a=!StrLine%%b!"
  32. Set "StrLine%%b=!StrLineT!"
  33. @Rem 这三个命令其实就是说,如果第二个大于第一个就将两个数组中的数值做一个替换
  34. )
  35. )
  36. )
  37. )
  38. For /l %%a in (1,1,%NumValue%) do (
  39. Echo !StrLine%%a!
  40. )
  41. @Rem 将排序好的数组显示出来
  42. Pause
复制代码

作者: guaiwu    时间: 2011-9-14 23:47

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in (22.txt) do (
  4. set /a n+=1
  5. set _!n!=%%i
  6. )
  7. for /l %%i in (1,1,!n!) do (
  8. for /l %%j in (%%i+1,1,!n!) do (
  9.                 if !_%%i! gtr !_%%j! (
  10.                         set var=!_%%i!
  11.                         set _%%i=!_%%j!
  12.                         set _%%j=!var!
  13.                 ))
  14. echo !_%%i!
  15. )
  16. pause
复制代码

作者: Batcher    时间: 2011-9-15 07:29

回复 6# 冷玉公子


排序一般都是两层for循环,你这个四层for循环优势在何处?
作者: Batcher    时间: 2011-9-15 07:30

常见几种排序的批处理写法
http://bbs.bathome.net/thread-4196-1-1.html
作者: CrLf    时间: 2011-9-15 11:35

回复 6# 冷玉公子


    有想法,不过这样一来,命令的执行次数以指数级增长,效率会比较低...
作者: 冷玉公子    时间: 2011-9-19 02:53

本帖最后由 冷玉公子 于 2011-9-19 02:56 编辑

回复 8# Batcher


    因为这样的排序会有一个通病,就是前三个数值的排序问题,例如
   5
   7
   3
   6
   8
    这样的话第一次的结果就会是:53678。  5还是会在第一个。
    所以我多加了一次循环只是为了,避免这个错误发生。

其实14行的For完全可以改成循环两次就OK了,但是这不为了通用就复杂了一点。哈哈
作者: Batcher    时间: 2011-9-19 20:50

回复 11# 冷玉公子


本来是O(n^2)的排序算法,被你“改良”成了O(n^4),方向完全是搞反了嘛,哈哈。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2