【首发】世上最强文本排序算法!!!!!!!!!!
啰嗦:
罪魁祸首:求个排序算法
https://bbs.125.la/forum.php?mod=viewthread&tid=14758896
(出处: 精易论坛)
@wacy1024
本来没啥,要是针对这一个功能进行写的话,可能真的花不了我一天,顶多半个小时到一个小时就可以搞定
但是,这篇帖子勾起了我n年前的一个突发奇想,不过那时候没时间去写也就渐渐淡忘了,
本来以为,可能顶多一上午就可以写完
但是我尝试了整整四遍,什么 冒泡算法,多维数组+冒泡算法,ASCII码+冒泡算法
最后还是回归了原生的冒泡算法才解决了问题(冒泡算法YYDS!)
然后本贴不光是对源码的分享,我希望我可以在这里讲清我的算法是如何实现的
毕竟结果不重要,重要的算法思路的学习和领悟~
实现:
1. 什么是冒泡算法?
冒泡算法是一种对数组的排序方法,详细的解释可以去看看其他地方,这里不过多解释
但请注意以下内容都是基于你知道冒泡算法是什么,以及如何写的情况下诉说的
当然,冒泡算法的写法各有不同(但好像也大同小异)
这里以以下写法为准
计次循环首 (取数组成员数 (数组 ) - 1, i )计次循环首 (取数组成员数 (数组 ) - i, j )如果真 (数组 [j ] > 数组 [j + 1 ]) 交换变量 (数组 [j ], 数组 [j + 1 ])计次循环尾 ()计次循环尾 () 如果你确保能理解以上算法的话就往下读吧
2. 文本排序应有的机制是什么?
你觉得一般文本排序应该按照什么排序?
“0-9”?“a”-“z”?“A”-“Z”?
不不不
小孩子才做选择,我三个全要!
有重复的咋办?
简单,判断下一级(以下全文的下一级指的是下一个文本,比如 “A1”的第一级文本指的是“A”,第二级文本指的是“1”)
好吧,说起来简单做起来难..
3. 实现
只讲成功的方案(四尝;以下出现的 一尝,二尝,三尝之类的对应第一次尝试,第二次尝试..因为不想删代码所以我就留在那了,最后成功可以使用的是四尝~)
首先,按照 “0-9” “a”-“z” “A”-“Z” 的方式排序,非常简单,直接冒泡算法,但是判断大小的时候只判断数组[j]的第一个文本,然后交换变量时交换一整个成员即可~
这一点我只花了不到半个小时(还是边上网课边写的)
但问题来了,第二级文本应该如何搞?
(群里有人说模仿第一级文本直接排序~,但是用脚丫子都能想出来排序了第二级的话第一级一定会出问题)
我也是在这一点上卡了好久好久好久好久,然后想到了利用多维数组,将数字,小写字母,大写字母分成一类并且存进指定维进行排序~(二尝)
其实这离标准答案很接近了,但是那个时候没想到【苦笑】
利用多维数组有什么坏处?
不治标不治本,就算是分成一类进行排序,但是 类似“A1’这种出现了两个不同的类型且在不同级的文本直接就废了
万幸的是写到一半我就意识到了这个问题,然后停了
又有人建议我用 ASCII码进行判断(三尝)
确实可以,仅限单级
遇到的问题还是和三尝一样~
然后我就抛开所有的不谈,重新尝试 一尝 其实 二尝 和 三尝 给了我很大的思路建议,所以我就单开了四尝
前半段单级排序我直接把一尝的给扣下来了
后半段我则是模仿了 二尝 进行分类
不过,并没有用多维数组
将数组分为 四大类 “0-9” “a”-“z” “A”-“Z” 以及其它无法排序的文本
怎么分的类?
在一尝的单级算法中
因为这四大类的冒泡排序可以说是毫不相干的
这就导致这四大类算是在自己排序自己的不管其它成员啥事,那么他们相对于自己的位置来讲是排序了的,相对整个数组来讲还是一锅粥(自己调试输出理解一下这句话)
那么后面我就需要单独将这四大类提取出来,按照一定的顺序拼接回去(直接看源码很好理解的)
停,
emm这不巧了嘛
我们将 一尝的代码进行修改
加入一个叫 序号 的参数(理解为需要排序的文本层级)
在”单独将这四大类提取出来“时,进行判断
如果 其中一个类中出现了一个数据的长度是大于当前操作层级的
那么,就再次调用此子程序,不过传进去的参数是 当前操作层级+1 即下一层级
这样就可以限制他 只对此类中的下一级文本进行操作
所以其实就这么简单
我一直都没想到整个点【服】
最后总结一下
已实现功能:
对 “0-9” “a”-“z” “A”-“Z”进行排序,如果排序中有重复的则排序下一级数组
比如
{ “A1”, “C5”, “B4”, “0A”, “A2”, “A3”, “E5”, “A4” }
被排序为
{“0A”,“A1”,“A2”,“A3”,“A4”,“B4”,“C5”,“E5”}
数字>小写字母>大写字母
本质上是一种仿windows对文件的排序
但是与其规则又有所不同
源码下载:
排序.rar
(9.5 KB, 下载次数: 135)
|