字符串低位优先排序(LSD)和高位优先排序(MSD)原理及C++实现

前言:

        最近正好在学习字符串相关的算法,写了下LSD、MSD以及三向快速排序算法,写完了过后有很大的感触,所以决定把这几天所学习的东西记录下来。

原理:

键索引计数法:
        在开始介绍LSD以及MSD算法之前,我们要介绍一个算法——键索引计数法,这是LSD以及MSD的基础。
        键索引计数法允许我们通过一定的键值来对字符串进行排序,一个很好的例子就是 分组——每个学生对应一个小组,将他们按照小组分开。在这个问题中,学生姓名就是字符串,而小组的组号就是对应的键值,我们需要将相同小组的同学分到一起(如图一)
        为了完成上述的功能,我们先统计每个键值的个数并计入一个Count数组中, Count[n + 1]中统计键值为n的字符串的个数,在上图中Count[2] = 2,Count[3] = 1,Count[4] = 2;在统计完成后,我们需要将频数转换为索引,这是至关重要的一步,在这里你也会发现为什么我们用Count[n + 1]来统计键值n而不是Count[n]。在这一步中我们 使Count[n + 1] += Count[n],这样你会发现Count[0] = 0,Count[1] = 0,Count[2] = 2,Count[3] = 3;可以发现这样变换了以后Count[n]正是下一个键值为n的字符串的索引下标!最后我们只需要根据索引将字符串存入我们预先准备的字符串数组及可以完成分组,具体的代码我们可以在后面的LSD以及MSD中看到!

低位优先排序(LSD):
        低位优先排序在我们的生活中经常见到,比如银行卡号的排序、车牌的排序以及电话号码的排序等,我们可以发现一个规律,那就是这些东西的长度都是相等的!这并不是巧合,而是LSD算法的性质决定的,LSD适用于较短的定长字符。
        LSD算法要求用于排序的字符串数组中的每一个字符串的长度相同,然后从最低位(即最右边的字符)开始,用键索引计数法对字符串排序,一直到用最高位进行键索引排序,则退出算法完成排序(如图2所示)
        从图中我们可以发现LSD算法正如其名字一样,从低位开始保证其有序(红框内部分);当然,只要熟练掌握键索引计数法,LSD的编写将会很简单;具体代码如下:
  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值