[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 本人感觉批处理冒泡排序法比sort效率高

本帖最后由 applba 于 2011-4-26 10:57 编辑

这个代码是昨天晚上捣鼓出来的,感觉效果还不错……

1000个排序也是瞬间,10000个开始卡了,估计是查询变量耗时严重了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 默认产生100个随机数
  4. set n=100
  5. for /l %%i in (1,1,!n!) do set /a _%%i=!random!+1
  6. rem 开始排序并输出结果
  7. for /l %%i in (1,1,!n!) do (
  8.         for /l %%j in (%%i+1,1,!n!) do (
  9.                 if !_%%i! gtr !_%%j! (
  10.                         set var=!_%%i!
  11.                         set _%%i=!_%%j!
  12.                         set _%%j=!var!
  13.                 )        
  14.         )
  15. echo !_%%i!
  16. )
  17. pause
复制代码

感觉有时候可能不靠谱哦,为何不做个试验来对比一下呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

2# Batcher


真的不靠谱呀。

看来还是自带命令效率高。

但是sort排序需要统一数字位数……………………

TOP

这样用 %%i+1 ?

TOP

本帖最后由 applba 于 2011-4-26 23:00 编辑

有问题了,编辑中

TOP

可以是可以,但是没有算术效果啊...昨天看到这个用法时激动万分,以为是新大陆,结果一测试才发现(1+5,1,5)和(1,1,5)结果一样

TOP

汗,+1确实失效了。

不过这对结果没有影响,效率上就差了点。

正常的比较次数是n(n-1)/2,而这样后成了n(n+1)/2。

TOP

本帖最后由 batman 于 2011-4-27 09:22 编辑

跟风:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,500) do set "str=!str! !random!"
  3. for %%a in (%str%) do (
  4.     if defined .!_%%a! (
  5.        for %%b in (.!_%%a!) do set "%%b=!%%b! %%a"
  6.        ) else (
  7.        for %%b in (%str%) do if %%a geq %%b set /a _%%a+=1
  8.        set ".!_%%a!=%%a"
  9.     )
  10. )
  11. for /l %%a in (1,1,500) do set "var=!var! !.%%a!"
  12. echo !var!
  13. pause>nul
复制代码
***共同提高***

TOP

再来个效率高的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,500) do set "str=!str! !random!"
  3. for %%a in (%str%) do (
  4.     set /a n+=1
  5.     set "str=0000000000%%a"&set "str=!str:~-10!"
  6.     set "_!str!_!n!=%%a"
  7. )
  8. for /f "tokens=2 delims==" %%a in ('set _') do set "var=!var! %%a"
  9. echo !var!
  10. pause>nul
复制代码
***共同提高***

TOP

这个不通用:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,500) do set "str=!str! !random!"
  3. for %%a in (%str%) do (
  4.     for %%b in (min max) do (
  5.         if not defined %%b (
  6.            set /a %%b=%%a
  7.            ) else (
  8.            if %%b equ min if %%a lss !min! set /a min=%%a
  9.            if %%b equ max if %%a gtr !max! set /a max=%%a
  10.         )
  11.     )
  12.     if not defined _%%a (
  13.        set "_%%a=%%a"
  14.        ) else (
  15.        set "_%%a=!_%%a! %%a"
  16.     )
  17. )
  18. for /l %%a in (%min%,1,%max%) do (
  19.     for %%b in (!_%%a!) do set "var=!var! %%a"
  20. )
  21. echo !var!
  22. pause>nul
复制代码
***共同提高***

TOP

9# batman
老大的set /a n+=1这步实在没看出来用意
如果去掉的话好像也可以,以下是改篇老大的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,100) do set "str=!str! !random!"
  3. for %%a in (%str%) do (
  4.     set a=00000%%a&&set _!a:~-5!=%%a
  5. )
  6. for /f "tokens=1* delims==" %%i in ('set _') do echo %%j
  7. pause>nul
复制代码
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

11# wc726842270
你试下当str中有数值重复的情况看。。。
***共同提高***

TOP

哦,这点倒是没想,呵呵,明白了
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

本帖最后由 applba 于 2011-4-27 13:02 编辑

set a=00000%%a&&set _!a:~-5!=%%a

你写5个0我明白了,超级版主的10个0一下子把我蒙了……

感情这set也是个不错的东西,居然还能这样用,你们真是太油菜了……

TOP

本帖最后由 terse 于 2011-4-27 13:45 编辑

老东西翻出来
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,500) do set var=!var! !random!
  3. set "var=!var! "
  4. for /l %%i in (1,1,500) do (
  5.     for %%j in (!var!) do (
  6.         if defined str (   
  7.            if !str! gtr %%j (
  8.               set str=%%j&set d=%%j
  9.            ) else if !str! equ %%j set "d=!d! %%j"
  10.         ) else set str=%%j&set d=%%j
  11.     )
  12.     for %%j in (!str!) do set "var= !var: %%j = ! "
  13.     set var=!var:  = !
  14.     set var1=!var1! !d!&set str=
  15. )
  16. echo!var1!
  17. pause
复制代码

TOP

返回列表