afan
发表于 2010-8-1 14:25:47
正则试试~
如果是这样,估计会把傻子累死~~ O(∩_∩)OLocal $Num = 912345678
Local $time = TimerInit()
Local $Len = StringLen($Num), $b_Num, $out = $Num & @TAB, $i
For $i = $Len To 1 Step -1
$b_Num = StringMid($Num, $i, 1)
If $b_Num = $i Then ContinueLoop
$Num = StringRegExpReplace($Num, '(.{' & $b_Num - 1 & '})(.{' & $i - $b_Num & '})(.)(.*)', '$1$3$2$4')
If StringMid($Num, $i, 1) <> $i Then $i += 1
$out &= $Num & @TAB
Next
MsgBox(0, '耗时(ms): ' & TimerDiff($time), $out)
3mile
发表于 2010-8-1 14:28:26
本帖最后由 3mile 于 2010-8-1 14:57 编辑
各位的代码一个比一个高效。
佩服佩服!
pusofalse
发表于 2010-8-1 14:31:41
回复 16# afan
果真强大,妙极了。 我们的思路如出一辙似的,afan兄运用正则更胜一筹!
大绯狼
发表于 2010-8-1 14:31:47
本帖最后由 大绯狼 于 2010-8-1 14:35 编辑
Dim $out
$out = 0
$time = TimerInit()
Dim $before = 912345678
$num = StringSplit($before, "")
While 1
For $i = $num To 1 Step -1
If $num[$i] <> $i Then
$temp = $num[$i]
For $j = $num To $num[$i] + 1 Step -1
$num[$j] = $num[$j - 1]
Next
$num[$temp] = $temp
ReDim $out
$msg = ""
For $j = 1 To $num
$msg &= $num[$j]
Next
$out += 1
$out = $msg
ContinueLoop 2
EndIf
Next
$endtime = TimerDiff($time)
ExitLoop
WEnd
$msg = ""
For $i = 1 To $out
$msg &= "[" & $i & "]" & $out[$i] & ";"
Next
MsgBox(0, 0, "排序:" & $out & "次" & @CRLF & "排序过程:" & @CRLF & "" & $before & ";" & $msg & @CRLF & "用时:" & $endtime)时间大大提升 排序255次,时间在40-110MS之间。。。。。。我再研究研究
大绯狼
发表于 2010-8-1 14:33:37
正则试试~
如果是这样,估计会把傻子累死~~ O(∩_∩)O
afan 发表于 2010-8-1 14:25 http://www.autoitx.com/images/common/back.gif
正则太强大了。。。。。。。。。。。。学习中。。。。。这效率我是没办法了。
pusofalse
发表于 2010-8-1 14:38:18
回复 19# 大绯狼
不算初始序列的话,傻子最少要排序255次,255是正确的次数。
初始为912345678,大概是费时最多的序列了,诸位不妨探讨下,看能否想到一个更费时的序列。
大绯狼
发表于 2010-8-1 14:44:10
回复 21# pusofalse
找不到更费时的序列了,除非加数的数量。
afan
发表于 2010-8-1 14:44:36
呵呵,255次~ 一直以为移动的次数多了,硬是复查了一遍,都快累成对眼傻子了~~
应该没有更费时的序列了…
afan
发表于 2010-8-1 14:47:24
或者用26个字母做序列~ 排出来的话,傻子无敌了
大绯狼
发表于 2010-8-1 14:49:22
或者用26个字母做序列~ 排出来的话,傻子无敌了
afan 发表于 2010-8-1 14:47 http://www.autoitx.com/images/common/back.gif
好主意 马上测试
pusofalse
发表于 2010-8-1 14:52:45
感谢诸位参与!以下是我的解,跟afan兄思路相似。#include <Array.au3>
Local $sInitSeq = "912345678"
Local $iNumberofBooks = StringLen($sInitSeq)
Local $iObjIndex = $iNumberofBooks
Local $iSelfIndex, $sTempSeq, $sResult = $sInitSeq & ","
Local $iTimer = TimerInit()
While $iObjIndex
If StringMid($sInitSeq, $iObjIndex, 1) = $iObjIndex Then
$iObjIndex -= 1
Else
$sTempSeq = $sInitSeq
$iSelfIndex = StringMid($sTempSeq, $iObjIndex, 1)
$sInitSeq = StringLeft($sTempSeq, $iSelfIndex - 1) & $iSelfIndex
$sInitSeq &= StringMid($sTempSeq, $iSelfIndex, $iObjIndex - $iSelfIndex)
$sInitSeq &= StringTrimLeft($sTempSeq, $iObjIndex)
$sResult &= $sInitSeq & ","
EndIf
WEnd
$sResult = StringSplit(StringTrimRight($sResult, 1), ",")
_ArrayDisplay($sResult, TimerDiff($iTimer))
xsjtxy
发表于 2010-8-1 14:52:57
太伤脑壳了。想了半天。本来都要实现了。看到正则这么简单。我就马上放弃了。
afan
发表于 2010-8-1 14:55:38
感谢诸位参与!以下是我的解,跟afan兄思路相似。
pusofalse 发表于 2010-8-1 14:52 http://www.autoitx.com/images/common/back.gif
这效率真无敌…
大绯狼
发表于 2010-8-1 15:07:13
感谢诸位参与!以下是我的解,跟afan兄思路相似。
pusofalse 发表于 2010-8-1 14:52 http://www.autoitx.com/images/common/back.gif
代码赏心悦目,但是效率上比AFAN的要差一点点,我看你们2个的代码都吃力。。。学习去了
另:26个字母跑了10分钟没跑完,我放弃了。
pusofalse
发表于 2010-8-1 15:42:33
这傻子可能也不太傻~ ^_^
再次感谢诸位参与!