挑战:数字排序
关于数字排序的代码已经讨论过很多次了。
目前就本人所知道的大至有以下几种
1、冒泡法
此法应该算是目前效率最高的了。可以处理cmd范围内的任何数字及重复数字。
2、将需排序的数字设为变量名
此法不能处理负数、和重复的数字,适合对文本进行一次性排序,
但若对文本逐行处理时效率极不理想。(代码简洁)
3、先把位数补齐,再用sort命令排序
此法适合处理超大数及海量数据,适合对文本进行一次性排序,
但若对文本逐行处理效率更不理想。(代码复杂,需临时文件配合)
挑战:冒泡排序法
加分条件:功能齐全、效率高出冒泡法 10 分
功能齐全、效率高出冒泡法、代码简洁。满分 15 分
因个人电脑配置不一,所以请各位同时帖出 冒泡法运行时间和自己的代码运行时间。
前提:a.txt 内容为5000行 每行有10个随机数(cmd范围内的)可能有负数及重复数和0
要求:把a.txt每行的数字进行排序
例:a.txt 部分内容如下
- -12051 -8021 -14576 -7510 -4872 -6546 -31396 0 13961 0 13961
- -14912 13403 -2365 30009 31652 -25405 -13924 0 -1349 0 -1349
复制代码
要求 b.txt 如下
- -31396 -14576 -12051 -8021 -7510 -6546 -4872 0 0 13961 13961
- -25405 -14912 -13924 -2365 -1349 -1349 0 0 13403 30009 31652
复制代码
- @echo off&set "f="
- ::创建测试文件代码
- cd.>a.txt
- setlocal enabledelayedexpansion
- for /l %%a in (1 1 5000) do (
- set "a="
- for /l %%i in (1 1 6) do (
- set /a w=!random!%%2
- if !w! equ 0 (set f=-) else set "f="
- set a=!a! !f!!random!
- )
- set b=!f!!random!&set b=!w! !b! !w! !b!
- >>a.txt echo !a:~1! !b!
- )
- pause
复制代码
计算效率代码
将 time0.bat 保存在批处理当前目录或system32目录,方便测试代码运行时间
调用方法
变量 t 为代码运行的起始时间。
set t=%time%
call time0.bat %t% %time% ok
echo %oK%
pause
- :time0 计算时间差 (封装)
- @echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.net
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set %~3=%ok:-=%&goto :EOF
复制代码
测试冒泡法代码
- @echo off&echo 正在测试 冒泡法数字排序。。。。
- :: 测试冒泡法 cmd范围数 5000行 每行10个数
- :: 本机测试 耗时:0 小时 0 分钟 31 秒 36 毫秒
- :: 测试环境:xp-sp2 cpu AMD 3000+ 1.81 GHz 内存:1G
- set t=%time%
- setlocal enabledelayedexpansion
- echo.>nul 3>b.txt
- for /f "delims=" %%a in (a.txt) do (
- setlocal
- set a=0&set "str="
- for %%i in (%%a)do set /a a+=1,b=a-1&set "num!a!=%%i"
- for /l %%i in (1 1 !b!) do (set /a var=%%i+1
- for /l %%j in (!var! 1 !a!) do (
- set /a var1=!num%%i!,var2=!num%%j!
- if !var1! gtr !var2! (set num%%i=!var2!&set num%%j=!var1!)))
- for /l %%i in (1 1 !a!) do set "str=!str! !num%%i!"
- echo !str!
- endlocal
- )
- call time0 %t% %time% ok&echo.&echo !ok!
- echo.>nul 4>con
- start "" "notepad" b.txt
- exit
复制代码
|