找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 70507|回复: 20

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

[复制链接]
发表于 2011-4-26 07:34:46 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码
发表于 2011-4-26 10:34:39 | 显示全部楼层
感觉有时候可能不靠谱哦,为何不做个试验来对比一下呢?
 楼主| 发表于 2011-4-26 11:25:24 | 显示全部楼层
2# Batcher


真的不靠谱呀。

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

但是sort排序需要统一数字位数……………………
发表于 2011-4-26 13:39:56 | 显示全部楼层
这样用 %%i+1 ?
 楼主| 发表于 2011-4-26 22:31:19 | 显示全部楼层
本帖最后由 applba 于 2011-4-26 23:00 编辑

有问题了,编辑中
发表于 2011-4-26 22:37:08 | 显示全部楼层
可以是可以,但是没有算术效果啊...昨天看到这个用法时激动万分,以为是新大陆,结果一测试才发现(1+5,1,5)和(1,1,5)结果一样
 楼主| 发表于 2011-4-26 23:13:41 | 显示全部楼层
汗,+1确实失效了。

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

正常的比较次数是n(n-1)/2,而这样后成了n(n+1)/2。
发表于 2011-4-27 00:11:03 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2011-4-27 00:25:40 | 显示全部楼层
再来个效率高的:

  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
复制代码
发表于 2011-4-27 01:20:45 | 显示全部楼层
这个不通用:

  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
复制代码
发表于 2011-4-27 11:05:09 | 显示全部楼层
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
复制代码
发表于 2011-4-27 11:35:46 | 显示全部楼层
11# wc726842270
你试下当str中有数值重复的情况看。。。
发表于 2011-4-27 11:39:21 | 显示全部楼层
哦,这点倒是没想,呵呵,明白了
 楼主| 发表于 2011-4-27 12:59:40 | 显示全部楼层
本帖最后由 applba 于 2011-4-27 13:02 编辑

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

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

感情这set也是个不错的东西,居然还能这样用,你们真是太油菜了……
发表于 2011-4-27 13:43:42 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 13:40 , Processed in 0.028318 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表