Board logo

标题: [数值计算] 本人感觉批处理冒泡排序法比sort效率高 [打印本页]

作者: applba    时间: 2011-4-26 07:34     标题: 本人感觉批处理冒泡排序法比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
复制代码

作者: Batcher    时间: 2011-4-26 10:34

感觉有时候可能不靠谱哦,为何不做个试验来对比一下呢?
作者: applba    时间: 2011-4-26 11:25

2# Batcher


真的不靠谱呀。

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

但是sort排序需要统一数字位数……………………
作者: terse    时间: 2011-4-26 13:39

这样用 %%i+1 ?
作者: applba    时间: 2011-4-26 22:31

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

有问题了,编辑中
作者: CrLf    时间: 2011-4-26 22:37

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

汗,+1确实失效了。

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

正常的比较次数是n(n-1)/2,而这样后成了n(n+1)/2。
作者: batman    时间: 2011-4-27 00:11

本帖最后由 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
复制代码

作者: batman    时间: 2011-4-27 00:25

再来个效率高的:
  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
复制代码

作者: batman    时间: 2011-4-27 01:20

这个不通用:
  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
复制代码

作者: wc726842270    时间: 2011-4-27 11:05

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
复制代码

作者: batman    时间: 2011-4-27 11:35

11# wc726842270
你试下当str中有数值重复的情况看。。。
作者: wc726842270    时间: 2011-4-27 11:39

哦,这点倒是没想,呵呵,明白了
作者: applba    时间: 2011-4-27 12:59

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

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

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

感情这set也是个不错的东西,居然还能这样用,你们真是太油菜了……
作者: terse    时间: 2011-4-27 13:43

本帖最后由 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
复制代码

作者: applba    时间: 2011-4-27 13:57

15# terse


这样不需要考虑字符串限制吗?
我当初就是因为这个而放弃了set str=!str! !random!
作者: terse    时间: 2011-4-27 14:40

16# applba
这个有限制的 所以不通用 仅当娱乐
另你一楼的  变量var 是多余的 可去除
作者: applba    时间: 2011-4-27 17:08

17# terse


开启变量延迟后需要中间变量才能交换把?

还是有新方法?
作者: batman    时间: 2011-4-28 00:16

递归法(效率一般)
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,500) do set "str=!str! !random!-%%a"
  3. echo !str!
  4. for /l %%a in (1,1,250) do (
  5.     for %%a in (!str!) do (
  6.         for /f "tokens=1,2 delims=-" %%b in ("%%a") do (
  7.             for %%d in (max min) do (
  8.                 if not defined %%d (
  9.                    set /a %%d=%%b
  10.                    ) else (
  11.                    if %%d equ max if %%b gtr !%%d! set /a %%d=%%b
  12.                    if %%d equ min if %%b lss !%%d! set /a %%d=%%b
  13.                 )
  14.              )
  15.         )
  16.      )
  17.      for %%a in (max min) do (
  18.          for %%b in (!str!) do (
  19.              for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
  20.                  if %%c equ !%%a! (
  21.                     set "str=!str: %%b=!"
  22.                     if %%a equ max set "_%%a=%%c !_%%a!"
  23.                     if %%a equ min set "_%%a=!_%%a! %%c"
  24.                   
  25.                  )
  26.               )
  27.           )
  28.           set "%%a="
  29.       )
  30. )
  31. echo %_min:~1% %_max:~1%
  32. pause>nul
复制代码

作者: terse    时间: 2011-4-28 03:23

18# applba
虽说在 15楼代码有字符长度限制 但效率并不低 故放上来的  下面就是所谓的冒泡把
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=500
  3. for /l %%i in (1,1,!n!) do set /a _%%i=!random!
  4.     for /l %%i in (1,1,!n!) do (
  5. set /a m=%%i+1
  6. for /l %%j in (!m!,1,!n!) do if !_%%i! gtr !_%%j! set/a _%%j=_%%i,_%%i=!_%%j!
  7.         echo !_%%i!
  8.     )
  9. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2