Board logo

标题: 如何实现数字的排序 [打印本页]

作者: pcl83     时间: 2006-10-4 09:22    标题: 如何实现数字的排序

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


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


[ Last edited by namejm on 2006-10-19 at 01:00 ]
作者: redtek     时间: 2006-10-4 09:58
使用 SORT.EXE 可以帮助你排序~:)
参数 /? 是帮助~:)

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

作者: pcl83     时间: 2006-10-4 14:26
那请问:现在有一组数字:9,82,765,现在要将它们以大小顺序排列出来,用sort命令怎么弄?
作者: electronixtar     时间: 2006-10-4 20:19
做这种体力活我一般到excel里做
作者: 不得不爱     时间: 2006-10-4 20:26
sort.exe 是排序文件里字符号码大小的!
如果a.txt里有下面的内容
654
4654
23
asfd
685
排序就输入:
sort a.txt
就得到:
23
4654
654
685
asfd
看了下这个命令是先从高位比较起,不符合人的习惯!
作者: 不得不爱     时间: 2006-10-4 23:09
如果有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%

作者: namejm     时间: 2006-10-5 05:47
  对数字进行排序倒是不难,楼主可以测试一下如下代码:
@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

作者: 3742668     时间: 2006-10-5 10:50
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

作者: pcl83     时间: 2006-10-6 10:00
能不能解释一下,那个%*是什么意思啊?
作者: namejm     时间: 2006-12-27 10:53
  3742668 兄的 part2 代码思路有不缜密的地方,举个极端的例子:假设 set numbers=2222 22 2 222222 222,代码就会出错,原因在于 if not "!str:%num%=!" == "" 这一句,是把所有的 %num% 置换为空,也就是说,只要其中的一个数值在其他数值中出现就会出错。
作者: scriptor     时间: 2006-12-27 11:24
恩,不错嘛,学习了
作者: namejm     时间: 2007-1-8 04:37
  翻看了一下老帖,才发现 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 ]
作者: pengfei     时间: 2007-1-8 04:41
关于排序的算法很多, 起泡法, 排序法, 计数法, 插入法, 归并法, 堆排法...

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

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

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