标题: [讨论] 批处理中构造数组实现数字的有序排列
[打印本页]
作者: pengfei
时间: 2006-11-15 00:16
标题: [讨论] 批处理中构造数组实现数字的有序排列
突然想用批处理对数字进行排序. 以前我们是对几个数字分别进行比对, 按照大小排列出来, 但处理的个数很小, 数字超过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 ]
作者: redtek
时间: 2006-11-15 00:43
欣赏~~:)
作者: vkill
时间: 2006-11-15 01:28
可以先判断位数,这样效率应该会高些
作者: pengfei
时间: 2006-11-15 01:32
RE: vkill
代码中不单有判断位数的功能, 还对次数循环做了精确控制, 执行效率是比较理想的.
[
Last edited by pengfei on 2006-11-20 at 08:48 AM ]
作者: ccwan
时间: 2006-11-15 01:39
确实不错。
作者: youxi01
时间: 2006-11-15 08:11
看看我们的“天才”斑竹的测试代码(好象是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_%
作者: 3742668
时间: 2006-11-15 08:40
Re youxi01:
解决9个参数的限制可以尝试用shift。
当然,更好的方法则是把你的代码中setlocal enabledelayedexpansion下面的那个for语句替换为: set "number=%*"
作者: pengfei
时间: 2006-11-15 09:40
看了3742668版主这段代码, 令我佩服不已...
显然这种通过把数字用空格间隔排列起来构造数组的方法更简单. 再通过for /f 命令将数组元素一个个读取再比对.
不但速度更快代码也简洁, 学习了...