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

[效率算法] 带数值的字符串数组排序讨论

 火... [复制链接]
发表于 2012-8-26 23:46:31 | 显示全部楼层
向大家学习,呵呵

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10

查看全部评分

发表于 2012-8-27 09:45:28 | 显示全部楼层
我来学习大佬们的算法!

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10

查看全部评分

发表于 2012-8-27 11:52:09 | 显示全部楼层
以下代码效率很差,纠结中...
#include <array.au3>
 
Dim $array[21] = ['czr1.5', _
                                'czr1.6abc', _
                'opear1000ab', _
                                'cxd5.9', _
                                'opear5.6', _
                                '64.1auto123', _
                                '4cxd0.25df5', _
                                'cadll8.613', _
                                'czr48as26', _
                                'opear5855as85', _
                                '45cxd0.25f', _
                                'auto984', _
                                'opear354df', _
                                'czr48', _
                                'opear5855', _
                                '45cxd0.25', _
                                'auto984', _
                                'opear354', _
                                '541auto1.3', _
                                'cadll861', _
                                'auto984dfa']

$timer = TimerInit()
$out=string_number($array)
_ArrayDisplay($out,TimerDiff($timer))

Func string_number($array)
Local $num=1

For $i=0 To UBound($array)-1;取列
        $tmp=StringRegExp($array[$i],'\d+|[^\d]+',3)
        If UBound($tmp)>$num Then $num=UBound($tmp)
Next

Local $new_array[UBound($array)][$num+2]
Local $new_len[$num+1]

For $i=1 To $num;定义第列长度
        $new_len[$i]=1
Next

For $i=0 To UBound($array)-1;取每列字符串长度
        $temp=StringRegExp($array[$i],'\d+|[^\d]+',3)
        $new_array[$i][0]=$array[$i]
        For $n=1 To UBound($temp)
                $new_array[$i][$n]=$temp[$n-1]
                $nl=StringRegExp($temp[$n-1],'\d+',3)
                If @error Then                        
                        If StringLen($temp[$n-1])>$new_len[$n] Then $new_len[$n]=StringLen($temp[$n-1])
                Else
                        If StringLen($nl[0])>$new_len[$n] Then $new_len[$n]=StringLen($nl[0])
                EndIf
        Next
Next

For $i=0 To UBound($new_array)-1;将每列格式化
        For $n=1 To UBound($new_array,2)-2
                $format='%0'&$new_len[$n]&'s'
                If $new_array[$i][$n]='' Then
                        $new_array[$i][$n]=StringFormat($format,0)
                ElseIf StringRegExp($new_array[$i][$n],'\d+',0) Then                
                        $new_array[$i][$n]=StringFormat($format,$new_array[$i][$n])
                EndIf
        Next
Next

For $i=0 To UBound($new_array)-1;将格式化后文本写入
        Local $string=''
        For $n=1 To UBound($new_array,2)-2
                $string&=$new_array[$i][$n]
        Next
        $new_array[$i][UBound($new_array,2)-1]=$string
Next
_ArraySort($new_array,0,0,0,UBound($new_array,2)-1)

Local $output[UBound($new_array)]
For $i=0 To UBound($new_array)-1
        $output[$i]=$new_array[$i][0]
Next

Return $output

EndFunc

评分

参与人数 1金钱 +70 贡献 +3 收起 理由
tryhi + 70 + 3 学习了

查看全部评分

发表于 2012-8-27 12:06:15 | 显示全部楼层
本帖最后由 Qokelate 于 2012-8-27 12:09 编辑

投机取巧的办法 , 不知是否符合要求
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1金钱 +30 贡献 +1 收起 理由
tryhi + 30 + 1

查看全部评分

 楼主| 发表于 2012-8-27 15:21:29 | 显示全部楼层
回复 36# Qokelate


    可惜完全不符合题意
发表于 2012-8-27 17:43:35 | 显示全部楼层
海公公,打赏几个碎银呗。小的好久没喝过酒了。

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10 袜子牛,你要金钱干嘛

查看全部评分

发表于 2020-2-22 21:54:00 | 显示全部楼层
看看,学习一下
发表于 2020-4-20 17:38:49 | 显示全部楼层
楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-22 16:03 , Processed in 0.068363 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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