返回列表 发帖

[数值计算] 函数封装:数字排序的批处理(2007-11-24更新)

===========================   数字排序,使用方法  ==========================
1、要调用本段函数,先将代码从:sort开始及以下所有内容拷贝到批处理中即可。

2、调用方法:   call :sort str 0 0 -81 1583 1698 107 1 258 7 37 1583 6 -2 2 9 8 7 15
           :sort 为标签名,也可以自己定义.
           str 为call 的第一个参数,代表变量名,%str%就是这段函数运行后得到的结果.

3、注意事项: 变量名必须为call的第一个参数。参数中不能含有其它符号。
========================================================================
代码一、
@echo off
:: 将数字排序 原创作者:3742668  原帖出自 cn-dos联盟
:: 整理:小楼一夜听春雨: 2007-11-21
::   
:: 整理后功能:
::    可以对cmd范围内所有整数字进行排序,即:可以处理 负数、0、正数。
::    可以处理重复数字。
:: 特点:  递归调用,速度快,
:: 缺点:
::    若作为 函数调用,在全局中都不能使用“_+27va8t_/\r#”作为变量名,否则出错。
::    不能处理0开头的数。_+27va8t_/\r#  此代码特意用了这个生僻的名称为变量名,以避免重复。
::代码:
set number=1 1698 107 2 258 0 37 1583 6 9 8 7 15 3 1 0 1 -5 -20 -1583 -1583
echo 排序前:
echo %number%
call :sort str %number%
echo.
echo 排序后:
echo %str%
echo\&pause
exit
:sort
   setlocal enabledelayedexpansion
   set var=%2&set "th="
   set var_=%*&set var_= !var_:%1=!
   for %%i in (!var_!) do if !var! leq %%i set var=%%i
   for %%i in (!var_!) do if !var! equ %%i set th=!th! %%i
   set _+27va8t_/\r#=!th:~1! !_+27va8t_/\r#!
   set var_= !var_: %var%= !
   if not "!var_: =!"=="" (
      endlocal&set _+27va8t_/\r#=%_+27va8t_/\r#%
      call :sort _+27va8t_/\r# %var_%)
   call set _+27va8t_/\r#=%%_+27va8t_/\r#%%
   endlocal&set %1=%_+27va8t_/\r#%
goto :eofCOPY
代码二、
@echo off
::将数字排序 作者:小楼一夜听春雨 2007-11-24
::特点:  利用sort排序。
::   可以对0以上(包括0)的任何整数进行排序。(以下代码可以处理200位以内的整数)
::   速度一般,处理的数字越多,速度越快,可以处理重复的数字
::   利用8个随机数来确定变量名不被重复,以达到处理重复数字的目的。
::缺点:
::     不能处理负数,对0开头的数,结果会虑掉首位的0
::
@echo off
echo 排序前:
set sis=1 20 2 0 5 1 0 38 20 3 1 5 4 3 1 22
echo  %sis%
call :sort str %sis%
echo\&echo 排序后:
echo %str%
pause&exit
:sort
setlocal enabledelayedexpansion
set num=&set str=
for /l %%i in (1 1 200) do set str=0!str!
for %%a in (%*) do (
  set var=!str!%%a&set var=!var:~-200!
  set _!var!_!random!!random!!random!!random!!random!!random!!random!!random!=a
)
for /f "tokens=1 delims=_=" %%a in ('set _^|sort') do (
for /f "tokens=* delims=0" %%i in ("%%a") do (
   if "%%i"=="" (set num=!num! 0) else set num=!num! %%i
))
endlocal&set %1=%num%
call set %1=%%%1:%1=%%
goto :eofCOPY
技术问题请到论坛发帖求助!

2楼的代码速度虽快,但有几个缺点
1、最小的数若有2个或2个以上,代码会进入死循环。
2、代码并不受9个参数的影响,可以是N个。
3、以上代码不能作为函数,带入到别的代码中。
技术问题请到论坛发帖求助!

TOP

:: 来一个排序的代码
::    可以对任何200位以内的超大数、负数、进行排序。可以处理重复数字。
::
@echo off
setlocal EnableDelayedExpansion
::  by  小楼一夜听春雨 2007-11-25
for /l %%a in (1 1 200) do set lin=0!lin!
for /f "delims=" %%a in (a.txt) do (
   set str=%%a
   if "!str:~0,1!"=="-" (set fus=a&set str=!str:~1!&set zf=_) else set zf=+
   set str=!lin!!str!
   set !zf!!str:~-200! !random!!random!!random!!random!!random!!random!!random!=a
)
if defined fus call :lis _ /r
call :lis +
pause&exit
:lis
for /f "tokens=1,2 delims=_+= " %%a in ('set %1^|sort %2') do (
   for /f "tokens=* delims=0" %%i in ("%%a") do (
      if "%1"=="_" (set fuhao=-) else set fuhao=
      if "%%i"=="" (echo !fuhao!0) else echo !fuhao!%%i
   )
)
goto :eofCOPY
技术问题请到论坛发帖求助!

TOP

返回列表