找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 33021|回复: 11

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

[复制链接]
发表于 2011-9-8 23:49:17 | 显示全部楼层 |阅读模式
本帖最后由 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排序。希望能照着次代码的思路做下去,我不想断了自己这段代码、

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-9-9 00:12:48 | 显示全部楼层
想写冒泡排序么?sort命令?

评分

参与人数 1PB +3 收起 理由
CrLf + 3 乐于助人

查看全部评分

发表于 2011-9-9 08:59:25 | 显示全部楼层
按照楼主代码思路只能找到最大值或最小值,
发表于 2011-9-9 09:14:23 | 显示全部楼层
LZ是想升序(ASC)么?如果有兴趣看一下我写的 http://www.bathome.net/thread-13976-1-1.html
利用了ASCII字符表,进行了适当的极值,只要知道最大值的位数和最小的就差不多了
发表于 2011-9-9 10:23:03 | 显示全部楼层
批处理通用排序代码,大家来看哦。
http://www.bathome.net/viewthread.php?tid=13997&extra=

楼主的题我拿出来演示了 哈哈
发表于 2011-9-9 10:24:28 | 显示全部楼层

  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.        
  14.         For /l %%a in (1,1,%NumValue%) do (
  15.         @Rem 第二个循环,循环次数为文本的总行数,其实是为第一次排序。
  16.        
  17.                 For /f "tokens=* delims=." %%b in ("!StrLine%%a!") do Set StrLineNumValueA=%%b
  18.                 @Rem 找出排序依序值,本例中处理的是C类IP地址。所以取的值为最后一个IP地址.
  19.                
  20.                 Set "Var_Stepvalue=%%a"
  21.                 Set /a Var_Stepvalue+=1
  22.                 If !Var_Stepvalue! GEQ %NumValue% Set Var_Stepvalue=%NumValue%
  23.                 @Rem 这个IF只是用来限制判断行数不能超出最大的行数
  24.                 Echo !Var_Stepvalue! > %Temp%\Temp
  25.                 @Rem 因批处理没有办法或者说本人还没有发现更好的方法来实现真正的数组,所以只能利用局部变量来代替数组编号。
  26.                 @Rem 所以将这个位置的值用所需要的值,加1然后输出到一个文本中。方便让下一个For来将其作为局部变量来使用
  27.                
  28.                 For /f %%b in (%Temp%\Temp) do (
  29.                 @Rem 读取所需要的数组代号并赋值于局部变量%%b
  30.                         For /f "tokens=* delims=." %%b in ("!StrLine%%b!") do Set StrLineNumValueB=%%b
  31.                         @Rem 提取出于第一个数值做比较的第二个数值
  32.                        
  33.                         If !StrLineNumValueA! GTR !StrLineNumValueB! (
  34.                         @Rem 判断第二个数值是否大于第一个数值
  35.                                 Set "StrLineT=!StrLine%%a!"
  36.                                 Set "StrLine%%a=!StrLine%%b!"
  37.                                 Set "StrLine%%b=!StrLineT!"
  38.                                 @Rem 这三个命令其实就是说,如果第二个大于第一个就将两个数组中的数值做一个替换
  39.                         )
  40.                 )
  41.         )
  42. )
  43. For /l %%a in (1,1,%NumValue%) do (
  44.                 Echo !StrLine%%a!
  45. )
  46. @Rem 将排序好的数组显示出来
  47. Pause
复制代码

评分

参与人数 1PB +5 收起 理由
CrLf + 5 鼓励一下

查看全部评分

 楼主| 发表于 2011-9-14 23:47:20 | 显示全部楼层

  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
复制代码
发表于 2011-9-15 07:29:27 | 显示全部楼层
回复 6# 冷玉公子


排序一般都是两层for循环,你这个四层for循环优势在何处?
发表于 2011-9-15 07:30:20 | 显示全部楼层
常见几种排序的批处理写法
http://bbs.bathome.net/thread-4196-1-1.html

评分

参与人数 1PB +3 收起 理由
CrLf + 3 乐于助人

查看全部评分

发表于 2011-9-15 11:35:26 | 显示全部楼层
回复 6# 冷玉公子


    有想法,不过这样一来,命令的执行次数以指数级增长,效率会比较低...
发表于 2011-9-19 02:53:40 | 显示全部楼层
本帖最后由 冷玉公子 于 2011-9-19 02:56 编辑

回复 8# Batcher


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

其实14行的For完全可以改成循环两次就OK了,但是这不为了通用就复杂了一点。哈哈
发表于 2011-9-19 20:50:15 | 显示全部楼层
回复 11# 冷玉公子


本来是O(n^2)的排序算法,被你“改良”成了O(n^4),方向完全是搞反了嘛,哈哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 03:08 , Processed in 0.023534 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表