中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]数值排序(难并已解)
« [1] [2] [3] »
作者:
标题: [求助]数值排序(难并已解) 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 16 楼』:  

呵,没想数字排序居然在联盟掀起第二次风波。热闹。。
也贴一段以前的代码。助助兴
:
@echo off&goto start&rem 数字排序
a.txt 中为一行一个数字
可以对任何 200 位以内的整数进行排序。(包括负数、正数、0、及重复的数字)
缺点: 对于0开头的数字,结果会忽略首位的0
::by 26933062 2007-11-25
:start
setlocal EnableDelayedExpansion
for /l %%a in (1 1 200) do set lin=0!lin!
for /f %%a in (a.txt) do (
   set "str=%%a"
   if "!str:~0,1!"=="-" (set fus=a&set str=!str:~1!&set zf=_) else set zf=+
   set str=!lin!!str!
   set !zf!!str:~-200! !random!!random!!random!!random!!random!!random!!random!=a
)
if defined fus call :sort _ /r
call :sort +
pause&exit
:sort
for /f "tokens=1,2 delims=_+= " %%a in ('set %1^|sort %2') do (
   for /f "tokens=* delims=0" %%i in ("%%a") do (
      if "%1"=="_" (set fuhao=-) else set "fuhao="
      if "%%i"=="" (echo !fuhao!0) else echo !fuhao!%%i
   )
)
goto :eof


   此帖被 +7 点积分      点击查看详情   
评分人:【 plp626 分数: +7  时间:2008-5-4 22:01




致精致简!
2008-4-30 08:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 17 楼』:  

从负数到正数都可以,会去除重复的数字,对于开头为0得数字不能正确处理
@echo off
setlocal enabledelayedexpansion
set str= %random% %random% -%random% %random% %random% -%random% %random% -%random% %random% %random%
::对于 a.txt 中为一行一个数字采用下一行方式读取,上一行不要
::上一行set str= %random%...的数前面必需要有一个空格
::for /f %%i in (a.txt) do set str=!str! %%i
echo 排序前数组为: %str:~1%

:sort
    set num=m
    for %%i in (%str%) do if %%i lss !num! set num=%%i
    set ret=%ret% %num%
    set str=!str: %num%=!
    if not "%str%" == "" goto sort

echo 排序后数组为: %ret:~1%
pause
exit




2008-4-30 10:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 18 楼』:  

简化一下terse的方案,有不足再改吧
@echo off&setlocal enabledelayedexpansion
set/p str=输入数字(用空格隔开)
for %%i in (%str%) do (
    set str=0000000000%%i
    set .!str:~-10! !random!=%%i
)
for /f "tokens=2 delims==" %%i in ('set .') do set/p=%%i <nul
pause>nul


   此帖被 +5 点积分      点击查看详情   
评分人:【 plp626 分数: +5  时间:2008-4-30 16:27


2008-4-30 16:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 19 楼』:  

这么热闹,我也来一段了,缺点是效率有点低……
@echo off & Setlocal EnableDelayedExpansion

for /L %%i in (1,1,5) do (
        set skip=.!skip!
        findstr /rc:"^^!skip!$" file.txt|sort
)
for 里面的 5 根据数字的最大位数来指定,如果不知道也可以写个for语句计算出来,我这里免去了。

   此帖被 +15 点积分         点击查看详情   
评分人:【 plp626 分数: +15  时间:2008-4-30 17:28


2008-4-30 17:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 20 楼』:  



  Quote:
Originally posted by lxmxn at 2008-4-30 05:25 PM:
这么热闹,我也来一段了,缺点是效率有点低……
[code]@echo off & Setlocal EnableDelayedExpansion

for /L %%i in (1,1,5) do (
        set skip=.!skip!
        findstr /rc:"^^!ski ...

版主的代码没看懂,能否解释一下?
好象不支持负数排序

2008-4-30 18:02
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 21 楼』:  



  Quote:
Originally posted by huahua0919 at 2008-4-30 18:02:

版主的代码没看懂,能否解释一下?
好象不支持负数排序

就是简单的根据数字位数,findstr 出从一位到五位的数,然后 sort 排序就可以了,不过前提是数字都是正整数,而且知道最大位数,严格说起来这个不算是排序~

2008-4-30 23:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 22 楼』:  这种方法是什么原理?

为什么加一大串零在数字前,然后在环境变量里遍历时把零又截弃掉,它们便能自动排序?

请各位大侠提点一下.

2008-5-2 05:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 23 楼』:  还有为什么要加一些随机数?

怎么没人理我?

2008-5-2 11:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 24 楼』:  

99
1
888

排序结果是
1
888
99

如果补0的话~结果为:

00001
00099
00888

……

2008-5-2 12:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 25 楼』:  啊明白了,我真笨,没有想到这点

[quote]Originally posted by MLQX at 2008-5-2 11:26 AM:
谢谢了.quote]

[ Last edited by MLQX on 2008-5-2 at 12:34 PM ]

2008-5-2 12:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 26 楼』:  妙,好精炼的代码



  Quote:
Originally posted by zh159 at 2008-4-30 01:51 AM:
以前用过的,忘了出自哪里了
[code]@echo off
setlocal enabledelayedexpansion
    set numbers=%random% %random% %random% %random% %random% %random% %random% %random%
    echo 排序前 ...

来此论坛学了3 天,今天总算能看懂这段代码了.
在俺这个菜鸟看来,这种思维方法很独特.
在别人看来,也许不是独特,而是经典.

2008-5-2 12:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 27 楼』:  点号表示什么?



  Quote:
Originally posted by plp626 at 2008-4-29 11:59 PM:
[code]if not %1.==.

难首是文本文件里隐含的结束标志?抑或是表示行首或行尾的标志?

[ Last edited by MLQX on 2008-5-2 at 01:24 PM ]

2008-5-2 12:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 28 楼』:  再来个通用的:

&&想不到一石激起千重浪,几天未来论坛此贴已经变成了精华贴,而且如此之火,真是非我始之所料,今天将我原来的代码又研究了下,有了如下通用性极强的化码:
@echo off&setlocal enabledelayedexpansion
set "str=101 20 14 13 19 18 16 11 5 -7"
for %%i in (%str%) do call,set var=!var! n%%i
for %%i in (%var%) do set a=%%i&call :lp
echo !var:n=!
pause>nul&goto :eof
:lp
for %%i in (!var!) do (
    set b=%%i
    if !b:~1! lss %a:~1% (
       set var=!var:%a% =!
       set var=!var:%%i=%%i %a%!
    )
)




批处理之家新域名:www.bathome.net
2008-5-3 22:19
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
MLQX
初级用户





积分 28
发帖 15
注册 2008-4-28
状态 离线
『第 29 楼』:  我觉得有一个人的代码最精炼:

@echo off&for /f "delims=" %%i in ('sort /+n c.txt') do echo %%i


如果比较三位数,那么把n值改为3即可.

2008-5-4 00:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 30 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-5-3 22:19:
&&想不到一石激起千重浪,几天未来论坛此贴已经变成了精华贴,而且如此之火,真是非我始之所料,今天将我原来的代码又研究了下,有了如下 ...

不通用  你这样试 set "str=1111 111 20 14 13 19 18 16 11 5 -7"



简单!简单!再简单!
2008-5-4 12:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: