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

这傻子可能也不太傻~ ^_^
再次感谢诸位参与!
页: 1 [2] 3
查看完整版本: 输出《傻子排序法》