标题: [数值计算] 本人感觉批处理冒泡排序法比sort效率高 [打印本页]
作者: applba 时间: 2011-4-26 07:34 标题: 本人感觉批处理冒泡排序法比sort效率高
本帖最后由 applba 于 2011-4-26 10:57 编辑
这个代码是昨天晚上捣鼓出来的,感觉效果还不错……
1000个排序也是瞬间,10000个开始卡了,估计是查询变量耗时严重了- @echo off
- setlocal enabledelayedexpansion
- rem 默认产生100个随机数
- set n=100
- for /l %%i in (1,1,!n!) do set /a _%%i=!random!+1
- rem 开始排序并输出结果
- for /l %%i in (1,1,!n!) do (
- for /l %%j in (%%i+1,1,!n!) do (
- if !_%%i! gtr !_%%j! (
- set var=!_%%i!
- set _%%i=!_%%j!
- set _%%j=!var!
- )
- )
- echo !_%%i!
- )
- 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 编辑
跟风:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,500) do set "str=!str! !random!"
- for %%a in (%str%) do (
- if defined .!_%%a! (
- for %%b in (.!_%%a!) do set "%%b=!%%b! %%a"
- ) else (
- for %%b in (%str%) do if %%a geq %%b set /a _%%a+=1
- set ".!_%%a!=%%a"
- )
- )
- for /l %%a in (1,1,500) do set "var=!var! !.%%a!"
- echo !var!
- pause>nul
复制代码
作者: batman 时间: 2011-4-27 00:25
再来个效率高的:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,500) do set "str=!str! !random!"
- for %%a in (%str%) do (
- set /a n+=1
- set "str=0000000000%%a"&set "str=!str:~-10!"
- set "_!str!_!n!=%%a"
- )
- for /f "tokens=2 delims==" %%a in ('set _') do set "var=!var! %%a"
- echo !var!
- pause>nul
复制代码
作者: batman 时间: 2011-4-27 01:20
这个不通用:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,500) do set "str=!str! !random!"
- for %%a in (%str%) do (
- for %%b in (min max) do (
- if not defined %%b (
- set /a %%b=%%a
- ) else (
- if %%b equ min if %%a lss !min! set /a min=%%a
- if %%b equ max if %%a gtr !max! set /a max=%%a
- )
- )
- if not defined _%%a (
- set "_%%a=%%a"
- ) else (
- set "_%%a=!_%%a! %%a"
- )
- )
- for /l %%a in (%min%,1,%max%) do (
- for %%b in (!_%%a!) do set "var=!var! %%a"
- )
- echo !var!
- pause>nul
复制代码
作者: wc726842270 时间: 2011-4-27 11:05
9# batman
老大的set /a n+=1这步实在没看出来用意
如果去掉的话好像也可以,以下是改篇老大的- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,100) do set "str=!str! !random!"
- for %%a in (%str%) do (
- set a=00000%%a&&set _!a:~-5!=%%a
- )
- for /f "tokens=1* delims==" %%i in ('set _') do echo %%j
- 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 编辑
老东西翻出来- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1,1,500) do set var=!var! !random!
- set "var=!var! "
- for /l %%i in (1,1,500) do (
- for %%j in (!var!) do (
- if defined str (
- if !str! gtr %%j (
- set str=%%j&set d=%%j
- ) else if !str! equ %%j set "d=!d! %%j"
- ) else set str=%%j&set d=%%j
- )
- for %%j in (!str!) do set "var= !var: %%j = ! "
- set var=!var: = !
- set var1=!var1! !d!&set str=
- )
- echo!var1!
- 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
递归法(效率一般)- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,500) do set "str=!str! !random!-%%a"
- echo !str!
- for /l %%a in (1,1,250) do (
- for %%a in (!str!) do (
- for /f "tokens=1,2 delims=-" %%b in ("%%a") do (
- for %%d in (max min) do (
- if not defined %%d (
- set /a %%d=%%b
- ) else (
- if %%d equ max if %%b gtr !%%d! set /a %%d=%%b
- if %%d equ min if %%b lss !%%d! set /a %%d=%%b
- )
- )
- )
- )
- for %%a in (max min) do (
- for %%b in (!str!) do (
- for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
- if %%c equ !%%a! (
- set "str=!str: %%b=!"
- if %%a equ max set "_%%a=%%c !_%%a!"
- if %%a equ min set "_%%a=!_%%a! %%c"
-
- )
- )
- )
- set "%%a="
- )
- )
- echo %_min:~1% %_max:~1%
- pause>nul
复制代码
作者: terse 时间: 2011-4-28 03:23
18# applba
虽说在 15楼代码有字符长度限制 但效率并不低 故放上来的 下面就是所谓的冒泡把- @echo off&setlocal enabledelayedexpansion
- set n=500
- for /l %%i in (1,1,!n!) do set /a _%%i=!random!
- for /l %%i in (1,1,!n!) do (
- set /a m=%%i+1
- for /l %%j in (!m!,1,!n!) do if !_%%i! gtr !_%%j! set/a _%%j=_%%i,_%%i=!_%%j!
- echo !_%%i!
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |