找回密码
 加入
搜索
查看: 20120|回复: 37

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

[复制链接]
发表于 2012-8-20 17:51:48 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2012-8-20 22:56 编辑

字符串排序,但将字符串里面的数字当成数值,而不是字符串来操作,看下面截图排序前跟排序后你就清楚。





隐藏部分是我的算法,因为我发现我写的似乎较啰嗦,请大家自己发散思考个算法与大家分享,参与者加30至80分,不过可能要分几天来加分,但一定少不了,发出来请加入隐藏,不要影响到后来的思维。


另外算法中有什么BUG或者不对的请大家指点批评。


该算法是这样的,我朋友他需要对一批数据进行排列,这批数据前面是产品型号,后面是规格,需要将同样型号排在一起,且尺寸从小到大排裂,比如产品“ABC 10”、“ABC5”、“ABC20”、“ABC2.5”,需要排成这样“ABC2.5”“ABC5”“ABC10”“ABC20”,但在EXCEL中它会排成这样“ABC10”“ABC2.5”“ABC20”“ABC5”,所以才写出此算法
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1贡献 +8 收起 理由
lpxx + 8

查看全部评分

发表于 2012-8-20 18:58:14 | 显示全部楼层
#include <array.au3>

$timer = TimerInit()

Dim $array[7] = ["a", "bc", "sb12312", "123sb", "31sb", "4sb", "0.15sb"]
Dim $newarray[UBound($array)][2]
Dim $prenumber, $item

For $i = 0 To UBound($array) - 1
        $item = $array[$i]
        $prenumber = StringRegExp($item,"^-?[\d]+(\.\d+)?",2)
        Dim $tmpArr[2]
        If Not @error Then
                $newarray[$i][0] = $prenumber[0]
        Else
                $newarray[$i][0] = $item
        EndIf
        $newarray[$i][1] = $item
Next

_ArraySort($newarray)

For $i = 0 To UBound($newarray) - 1
        $array[$i] = $newarray[$i][1]
Next

_ArrayDisplay($array, TimerDiff($timer)) ;

评分

参与人数 2金钱 +40 贡献 +9 收起 理由
tryhi + 40 算法错误
lpxx + 9

查看全部评分

发表于 2012-8-20 19:05:00 | 显示全部楼层
#include <array.au3>

$timer = TimerInit()

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']
Dim $newarray[UBound($array)][2]
Dim $prenumber, $item

For $i = 0 To UBound($array) - 1
        $item = $array[$i]
        $prenumber = StringRegExp($item,"^-?[\d]+(\.\d+)?",2)
        If Not @error Then
                $newarray[$i][0] = Number($prenumber[0])
        Else
                $newarray[$i][0] = $item
        EndIf
        $newarray[$i][1] = $item
Next

_ArraySort($newarray)

For $i = 0 To UBound($newarray) - 1
        $array[$i] = $newarray[$i][1]
Next

_ArrayDisplay($array, TimerDiff($timer)) ;

评分

参与人数 2金钱 +30 贡献 +5 收起 理由
tryhi + 30 + 2 算法错误
lpxx + 3

查看全部评分

发表于 2012-8-20 19:22:01 | 显示全部楼层
围观高淫,菜鸟表示鸭梨山大...

评分

参与人数 1金钱 +10 贡献 +2 收起 理由
tryhi + 10 + 2 你是不愿出手啦

查看全部评分

发表于 2012-8-20 19:29:58 | 显示全部楼层
我想问如果字符串中同时出现2个单词该怎么排
如以上数字中有个123auto123cxd5.9,该排在哪?
它是该排在cxd中,还是auto中

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
tryhi + 20 + 2 感谢提问

查看全部评分

发表于 2012-8-20 19:55:10 | 显示全部楼层
看看,学习一下

评分

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

查看全部评分

发表于 2012-8-20 20:30:09 | 显示全部楼层
好好学习 天天向上

评分

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

查看全部评分

 楼主| 发表于 2012-8-20 22:10:08 | 显示全部楼层
本帖最后由 tryhi 于 2012-8-20 22:11 编辑
drunk 发表于 2012-8-20 18:58
drunk 发表于 2012-8-20 19:05


2楼3楼的排序失败,没有按照要求,看结果似乎跟_ArraySort函数没有区别,现在加不了分,等一会可以加分了定补回


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2012-8-20 22:13:20 | 显示全部楼层
我想问如果字符串中同时出现2个单词该怎么排

我想问如果字符串中同时出现2个单词该怎么排
如以上数字中有个123auto123cxd5.9,该排在哪?
它是该排在cxd中,还是auto中
duck904 发表于 2012-8-20 19:29


5楼可能没有理解是什么意思,排序肯定是对多个进行排,你说一个,没办法排
发表于 2012-8-20 22:19:04 | 显示全部楼层
本帖最后由 netegg 于 2012-8-20 22:21 编辑

不对呀,你这个排序方式不对呀,文字的时候从左到右,数字的时候又改成从右到左了,没这么排序的

评分

参与人数 1金钱 +30 贡献 +1 收起 理由
tryhi + 30 + 1 请看清题意

查看全部评分

 楼主| 发表于 2012-8-20 22:21:35 | 显示全部楼层
本帖最后由 tryhi 于 2012-8-20 22:23 编辑
转成ascii,按数字排序定索引,出原字符
netegg 发表于 2012-8-20 22:19


请蛋哥指点,多个数字出的ascii字符如何定大小



------------------------------------------------------


蛋哥修改回复修改得那么快,蛋哥可能没理解题意,请刷新一下看图,我做了个说明
发表于 2012-8-20 22:29:16 | 显示全部楼层
回复 11# tryhi

简单问一下
如你例图中18,19项
如果是opera59, opera581应该怎么排

评分

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

查看全部评分

 楼主| 发表于 2012-8-20 22:34:44 | 显示全部楼层
本帖最后由 tryhi 于 2012-8-20 22:35 编辑
回复  tryhi

简单问一下
如你例图中18,19项
如果是opera59, opera581应该怎么排
netegg 发表于 2012-8-20 22:29


581明显比59大,肯定是opera59排在前面啦,如果是普通排法581排在前面,此贴还有什么意义?所以说字符串中存在的“数值”而不是数字
发表于 2012-8-20 22:38:00 | 显示全部楼层
本帖最后由 netegg 于 2012-8-20 22:43 编辑

回复 13# tryhi
按你这个排序
opera59 < opera581, 大概意思,是不是从右向左排?
那么opera59和operb58呢?

评分

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

查看全部评分

 楼主| 发表于 2012-8-20 22:50:45 | 显示全部楼层
本帖最后由 tryhi 于 2012-8-20 22:54 编辑
回复  tryhi
按你这个排序
opera59 < opera581, 大概意思,是不是从右向左排?
那么opera59和operb58呢 ...
netegg 发表于 2012-8-20 22:38



opera581、opera59、operb58应该这样子排,先排左边的字符串,再对比右边数字


opera59
opera581
operb58
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-28 22:09 , Processed in 0.120144 second(s), 37 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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