中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论] 批处理中构造数组实现数字的有序排列
作者:
标题: [讨论] 批处理中构造数组实现数字的有序排列 上一主题 | 下一主题
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『楼 主』:  [讨论] 批处理中构造数组实现数字的有序排列

突然想用批处理对数字进行排序. 以前我们是对几个数字分别进行比对, 按照大小排列出来, 但处理的个数很小, 数字超过10个代码就会很冗长, 并且效率比较低.

如果批处理有像高级语言中数组类型的概念就好了, 但很遗憾. 在批处理中人工构造一个数组, 这个问题就好解决了.

于是写了以下代码, 可以对N个数字进行大到小或小到大的排序. 只需要改变IF语句中的"lss"或"gtr".
@echo off

setlocal enabledelayedexpansion

set num=0

:input

set /a num+=1

cls

set /p num%num%=请输入一组数字, 终止直接回车 [%num%]:

if not "!num%num%!"=="" goto input

set /a num-=1

set /a num_=num-1

cls

echo 排序former:

for /l %%k in (1,1,%num%) do (

    set /p ii=!num%%k!  <nul

)

for /l %%i in (1,1,%num_%) do (

    set /a n=num-%%i

    for /l %%j in (1,1,!n!) do (

        set x=%%j

        set /a y=x+1

        call :go
    )
)

echo.

echo.

echo 排序after:

for /l %%k in (1,1,%num%) do (

    set /p ii=!num%%k!  <nul

)

echo.

pause >nul

goto :eof

:go

if !num%x%! gtr !num%y%! (

    set i=!num%x%!

    set num%x%=!num%y%!

    set num%y%=!i!

)

goto :eof
测试代码:
@echo off

setlocal enabledelayedexpansion

for /l %%l in (1,1,10) do (

    set t=%%l

    call :start

)

set /a num_=num-1

echo 排序former:

for /l %%k in (1,1,%num%) do (

    set /p ii=!num%%k!  <nul

)

for /l %%i in (1,1,%num_%) do (

    set /a n=num-%%i

    for /l %%j in (1,1,!n!) do (

        set x=%%j

        set /a y=x+1

        call :go
    )
)

echo.

echo.

echo 排序after:

for /l %%k in (1,1,%num%) do (

    set /p ii=!num%%k!  <nul

)

echo.

pause >nul

goto :eof

:go

if !num%x%! lss !num%y%! (

    set i=!num%x%!

    set num%x%=!num%y%!

    set num%y%=!i!

)

goto :eof

:start

set j=!RANDOM:~0,1!

set num%t%=!RANDOM:~0,%j%!

set /a num+=1

goto :eof
[ Last edited by pengfei on 2006-11-15 at 06:54 AM ]

   此帖被 +2 点积分     点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-15 00:38


2006-11-15 00:16
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
redtek
金牌会员





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

欣赏~~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-15 00:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 3 楼』:  

可以先判断位数,这样效率应该会高些

2006-11-15 01:28
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




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

RE: vkill

代码中不单有判断位数的功能, 还对次数循环做了精确控制, 执行效率是比较理想的.

[ Last edited by pengfei on 2006-11-20 at 08:48 AM ]



业精于勤而荒于嬉,形成于思而毁于随。
2006-11-15 01:32
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 5 楼』:  

确实不错。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-15 01:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 6 楼』:  

看看我们的“天才”斑竹的测试代码(好象是37.....斑竹):

@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 (%str%) do if !num! gtr %%i set num=%%i
    set ret=%ret% %num%
    if not "!str:%num%=!" == "" call :sort !str:%num%=!
goto :eof

是不是效率更高呢!针对十进制/

以下是由以上代码改进来的“应用型”代码:
@echo off
color 1f
if "%1"=="" goto :instruction
setlocal enabledelayedexpansion
for %%i in (%1 %2 %3 %4 %5 %6 %7 %8 %9) do (
  if not "%%i"==""  set number=!number! %%i)
call :sort %number%
echo.
echo 以上数字由大到小依次为:
echo.
echo      %str%
pause>nul

:instruction
   cls
   echo.
   echo                          数字排序
   echo.
   echo ============================================================
   echo 说明:
   echo      该程序只能说基本达到要求;没有对数字进行过滤;
   echo 目前只支持最多9个数字的排序!
   echo.
   echo 使用方法如下:[%~nx0] [%%1] [%%2] [%%3] [%%4] ........
   echo =============================================================
   echo.
   cmd /k

:sort
   set var=%1
   set var_=%*
   for %%i in (%var_%) do (
       if !var! leq %%i set var=%%i)
   set str=!str! !var!
   set var_=!var_:%var%=!
   if not "%var_%"=="" call :sort %var_%

2006-11-15 08:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





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

Re youxi01:
    解决9个参数的限制可以尝试用shift。
    当然,更好的方法则是把你的代码中setlocal enabledelayedexpansion下面的那个for语句替换为: set "number=%*"

2006-11-15 08:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




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

看了3742668版主这段代码, 令我佩服不已...

显然这种通过把数字用空格间隔排列起来构造数组的方法更简单. 再通过for /f 命令将数组元素一个个读取再比对.

不但速度更快代码也简洁, 学习了...



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

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


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



论坛跳转: