找回密码
 加入
搜索
楼主: pusofalse

[效率算法] 输出《傻子排序法》

 火... [复制链接]
发表于 2010-8-1 14:25:47 | 显示全部楼层
正则试试~
如果是这样,估计会把傻子累死~~ O(∩_∩)O
Local $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)

评分

参与人数 6金钱 +222 贡献 +20 收起 理由
C.L + 30 + 10 非常棒!
gapkiller + 40 + 10 哇喔!
水木子 + 50 非常强大的afan前辈!
3mile + 30 果然精彩,学习了
大绯狼 + 22 学习中。。。

查看全部评分

发表于 2010-8-1 14:28:26 | 显示全部楼层
本帖最后由 3mile 于 2010-8-1 14:57 编辑

各位的代码一个比一个高效。
佩服佩服!
 楼主| 发表于 2010-8-1 14:31:41 | 显示全部楼层
回复 16# afan


    果真强大,妙极了。 我们的思路如出一辙似的,afan兄运用正则更胜一筹!
发表于 2010-8-1 14:31:47 | 显示全部楼层
本帖最后由 大绯狼 于 2010-8-1 14:35 编辑
Dim $out[1]
$out[0] = 0
$time = TimerInit()
Dim $before = 912345678
$num = StringSplit($before, "")
While 1
        For $i = $num[0] To 1 Step -1
                If $num[$i] <> $i Then
                        $temp = $num[$i]
                        For $j = $num[0] To $num[$i] + 1 Step -1
                                $num[$j] = $num[$j - 1]
                        Next
                        $num[$temp] = $temp
                        ReDim $out[UBound($out) + 1]
                        $msg = ""
                        For $j = 1 To $num[0]
                                $msg &= $num[$j]
                        Next
                        $out[0] += 1
                        $out[UBound($out) - 1] = $msg
                        ContinueLoop 2
                EndIf
        Next
        $endtime = TimerDiff($time)
        ExitLoop
WEnd
$msg = ""
For $i = 1 To $out[0]
        $msg &= "[" & $i & "]" & $out[$i] & ";"
Next
MsgBox(0, 0, "排序:" & $out[0] & "次" & @CRLF & "排序过程:" & @CRLF & "[0]" & $before & ";" & $msg & @CRLF & "用时:" & $endtime)
时间大大提升 排序255次,时间在40-110MS之间。。。。。。我再研究研究

评分

参与人数 1金钱 +40 收起 理由
pusofalse + 40 精彩,学习了!

查看全部评分

发表于 2010-8-1 14:33:37 | 显示全部楼层
正则试试~
如果是这样,估计会把傻子累死~~ O(∩_∩)O
afan 发表于 2010-8-1 14:25



正则太强大了。。。。。。。。。。。。学习中。。。。。这效率我是没办法了。
 楼主| 发表于 2010-8-1 14:38:18 | 显示全部楼层
回复 19# 大绯狼


    不算初始序列的话,傻子最少要排序255次,255是正确的次数。
初始为912345678,大概是费时最多的序列了,诸位不妨探讨下,看能否想到一个更费时的序列。
发表于 2010-8-1 14:44:10 | 显示全部楼层
回复 21# pusofalse


    找不到更费时的序列了,除非加数的数量。
发表于 2010-8-1 14:44:36 | 显示全部楼层
呵呵,255次~ 一直以为移动的次数多了,硬是复查了一遍,都快累成对眼傻子了~~
应该没有更费时的序列了…
发表于 2010-8-1 14:47:24 | 显示全部楼层
或者用26个字母做序列~ 排出来的话,傻子无敌了
发表于 2010-8-1 14:49:22 | 显示全部楼层
或者用26个字母做序列~ 排出来的话,傻子无敌了
afan 发表于 2010-8-1 14:47


好主意 马上测试
 楼主| 发表于 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))

评分

参与人数 1金钱 +100 收起 理由
afan + 100 无敌了,学习中

查看全部评分

发表于 2010-8-1 14:52:57 | 显示全部楼层
太伤脑壳了。想了半天。本来都要实现了。看到正则这么简单。我就马上放弃了。
发表于 2010-8-1 14:55:38 | 显示全部楼层
感谢诸位参与!以下是我的解,跟afan兄思路相似。
pusofalse 发表于 2010-8-1 14:52



    这效率真无敌…
发表于 2010-8-1 15:07:13 | 显示全部楼层
感谢诸位参与!以下是我的解,跟afan兄思路相似。
pusofalse 发表于 2010-8-1 14:52



    代码赏心悦目,但是效率上比AFAN的要差一点点,我看你们2个的代码都吃力。。。学习去了
另:26个字母跑了10分钟没跑完,我放弃了。
 楼主| 发表于 2010-8-1 15:42:33 | 显示全部楼层
这傻子可能也不太傻~ ^_^
再次感谢诸位参与!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 04:00 , Processed in 0.075430 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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