[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理怎样实现数值排序处理?

本帖最后由 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排序。希望能照着次代码的思路做下去,我不想断了自己这段代码、
1

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2
莫求昨天无悔,但愿今日无愧。

回复 11# 冷玉公子


本来是O(n^2)的排序算法,被你“改良”成了O(n^4),方向完全是搞反了嘛,哈哈。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

回复 8# Batcher


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

其实14行的For完全可以改成循环两次就OK了,但是这不为了通用就复杂了一点。哈哈

TOP

回复 6# 冷玉公子


    有想法,不过这样一来,命令的执行次数以指数级增长,效率会比较低...

TOP

常见几种排序的批处理写法
http://bbs.bathome.net/thread-4196-1-1.html
1

评分人数

    • CrLf: 乐于助人PB + 3
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# 冷玉公子


排序一般都是两层for循环,你这个四层for循环优势在何处?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  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
复制代码
莫求昨天无悔,但愿今日无愧。

TOP

  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
复制代码
1

评分人数

    • CrLf: 鼓励一下PB + 5

TOP

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

楼主的题我拿出来演示了 哈哈

TOP

LZ是想升序(ASC)么?如果有兴趣看一下我写的 http://www.bathome.net/thread-13976-1-1.html
利用了ASCII字符表,进行了适当的极值,只要知道最大值的位数和最小的就差不多了
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

按照楼主代码思路只能找到最大值或最小值,

TOP

想写冒泡排序么?sort命令?
1

评分人数

    • CrLf: 乐于助人PB + 3

TOP

返回列表