中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 如何实现数字的排序 上一主题 | 下一主题
pcl83
初级用户





积分 32
发帖 13
注册 2006-10-3
状态 离线
『楼 主』:  如何实现数字的排序

在批处理中,如何实现数字的排序?
例如我现在有10个数字,现要将它们由大到小的顺序排出来?怎么办?
谢谢先!
请给出可行性代码!


──────────────── 版务记录 ────────────────
执行:namejm
原标题:高手请进
现标题:如何实现数字的排序
说明:因原标题过于模糊,不便于论坛的搜索和管理,在本提示发表三日之后,
  楼主尚未更改标题,现由本人强制修改标题,并扣除楼主4点积分。
──────────────── 版务记录 ────────────────


[ Last edited by namejm on 2006-10-19 at 01:00 ]

   此帖被 -4 点积分     点击查看详情   
评分人:【 namejm 分数: -4  时间:2006-10-19 01:00


2006-10-4 09:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 2 楼』:  

使用 SORT.EXE 可以帮助你排序~:)
参数 /? 是帮助~:)

SORT.EXE 排序非常简单,用不着什么代码,详见它的帮助~:)
C:\>sort.exe /?


2006-10-4 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pcl83
初级用户





积分 32
发帖 13
注册 2006-10-3
状态 离线
『第 3 楼』:  

那请问:现在有一组数字:9,82,765,现在要将它们以大小顺序排列出来,用sort命令怎么弄?

2006-10-4 14:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 4 楼』:  

做这种体力活我一般到excel里做




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-4 20:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 5 楼』:  

sort.exe 是排序文件里字符号码大小的!
如果a.txt里有下面的内容
654
4654
23
asfd
685
排序就输入:
sort a.txt
就得到:
23
4654
654
685
asfd
看了下这个命令是先从高位比较起,不符合人的习惯!



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-4 20:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 6 楼』:  

如果有3个数下面的可以解决问题!
if %1 GTR %2 (set a=%2&set b=%1) else (set a=%1&set b=%2)
echo %a% %b%
if %a% GTR %3 (set c=%a%&set a=%3) else set c=%3
if %b% GTR %c% (set e=%b%&set b=%c%&set c=%e%)
echo %a%^<%b%^<%c%




我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-4 23:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 7 楼』:  

  对数字进行排序倒是不难,楼主可以测试一下如下代码:
@echo off
copy test.txt test.bak>nul
cd.>test.txt
for /f %%i in (test.bak) do call :split "%%i,:"

setlocal enabledelayedexpansion
:_sort
for /f %%i in (test.txt) do (
    set /a max=%%i
    for /f %%j in (test.txt) do (
        set /a num=%%j
        if !num! gtr !max! (set max=!num!) else (set max=!max!)
    )
    echo !max!
    >test1.txt findstr /v ^!max!$ test.txt
    move test1.txt test.txt
    goto _sort
)
move test.bak test.txt
pause
goto :eof

:split
for /f "tokens=1* delims=," %%i in (%1) do (
    >>test.txt echo %%i
    if not "%%j"==":" call :split "%%j"
)
goto :eof




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-5 05:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 8 楼』:  

part 1:
@echo off
    set numbers=%random% %random% %random% %random% %random% %random% %random% %random%
    echo 排序前数字为: %numbers%
    md sort_tmp && pushd sort_tmp
    for %%i in (%numbers%) do fsutil file createnew %%i %%i >nul
    echo 从小到大排列:
    dir /os /b
    popd && rd /s /q sort_tmp
pause
goto :eof
part 2:
@echo off
setlocal enabledelayedexpansion
    set numbers=%random% %random% %random% %random% %random% %random% %random% %random%
    echo 排序前数组为: %numbers%
    call :sort %numbers%
    echo 排序后数组为: %ret%
pause
goto :eof

:sort
    set num=%1
    set str=%*
    for %%i in (%*) do if !num! gtr %%i set num=%%i
    set ret=%ret% %num%
    if not "!str:%num%=!" == "" call :sort !str:%num%=!
goto :eof


2006-10-5 10:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pcl83
初级用户





积分 32
发帖 13
注册 2006-10-3
状态 离线
『第 9 楼』:  

能不能解释一下,那个%*是什么意思啊?

2006-10-6 10:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

  3742668 兄的 part2 代码思路有不缜密的地方,举个极端的例子:假设 set numbers=2222 22 2 222222 222,代码就会出错,原因在于 if not "!str:%num%=!" == "" 这一句,是把所有的 %num% 置换为空,也就是说,只要其中的一个数值在其他数值中出现就会出错。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-27 10:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 11 楼』:  

恩,不错嘛,学习了

2006-12-27 11:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 12 楼』:  

  翻看了一下老帖,才发现 3742668 兄以前曾经写过类似的代码(请点 这里 查看),在那个代码的基础上,稍微加工一下,就得到了如下代码:
@echo off
:: 数值范围在1~2147483647之间(含)
echo 排序前情况:
findstr /n . test.txt
echo.
echo.
echo                           按任意键继续...
pause>nul
echo.
echo 排序后情况:
setlocal enabledelayedexpansion
set num=0
set max=1
for /f "delims=" %%i in (test.txt) do (
    set /a num+=1
    call :sort_ %%i
    echo !num!:!str!
    set str=
)
echo.
pause
goto :eof

:sort_
set var= %*
:loop
for %%i in (%var%) do if %%i gtr !max! set max=%%i
set var=!var: %max% =  !
set str=!str! %max%
set max=1
set tmp=%var: =%
if not "%tmp%"=="" call :loop %var%
goto :eof
  test.txt格式举例:
289 2879 28 987 73 2147483647 1 1 13
82798 287 72 19 27
8897 8273 27678 387 288781
  再仔细看了看8楼的代码,发现更加高效、更加简洁,只要稍微修改一下(其实就是加上几个空格)就可以避免10楼所说的问题了:
@echo off
setlocal enabledelayedexpansion
    set numbers=11 111 1112 32 387
    echo 排序前数组为: %numbers%
    call :sort %numbers%
    echo 排序后数组为: %ret%
pause
goto :eof

:sort
    set num=%1
    set str= %*
    for %%i in (%*) do if !num! gtr %%i set num=%%i
    set ret=%ret% %num%
    if not "!str: %num% =!"=="" call :sort !str: %num% =  !
goto :eof
[ Last edited by namejm on 2007-1-7 at 04:34 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-8 04:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 13 楼』:  

关于排序的算法很多, 起泡法, 排序法, 计数法, 插入法, 归并法, 堆排法...

一般用选择法, 速度快, 容易理解. 在批处理中构造数组就能轻易地实现N位数的排序.

以前讨论过这种构造数组的排序方法, 3742668版主利用空格来构造数组效率高.

[ Last edited by pengfei on 2007-1-8 at 04:42 AM ]



业精于勤而荒于嬉,形成于思而毁于随。
2007-1-8 04:41
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: