|
pcl83
初级用户
积分 32
发帖 13
注册 2006-10-3
状态 离线
|
『楼 主』:
如何实现数字的排序
在批处理中,如何实现数字的排序?
例如我现在有10个数字,现要将它们由大到小的顺序排出来?怎么办?
谢谢先!
请给出可行性代码!
──────────────── 版务记录 ────────────────
执行:namejm
原标题:高手请进
现标题:如何实现数字的排序
说明:因原标题过于模糊,不便于论坛的搜索和管理,在本提示发表三日之后,
楼主尚未更改标题,现由本人强制修改标题,并扣除楼主4点积分。
──────────────── 版务记录 ────────────────
[ Last edited by namejm on 2006-10-19 at 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 来自 四川南充
状态 离线
|
|
2006-10-4 20:26 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
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
状态 离线
|
|
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 |
|