小白学算法3.2——高位优先字符串排序

小白学算法3.2——高位优先字符串排序

标签: 小白学算法


本节内容总结自《算法(第4版)》5.1节

1.高位优先字符串排序

字符串常见的排序算法有两种,分别是低位优先(LSD)和高位优先(MSD),低位优先从右向左检查字符,高位优先从左向右检查字符。低位优先字符串排序要求待排序的字符串长度一致,然而很多时候字符串长度并不一致,低位优先排序并不适用,此时就要用到高位优先排序或者三向字符串快排。

  • 高位优先排序对于待排序的字符串没有什么要求
  • 高位优先排序的过程中使用了键索引计数算法
  • 高位优先排序要特别注意字符串达到末尾的情况,因为当字符串达到末尾时,比其本身加上任意字符都要小,如app小于apple。为了判断字符串是否已达到末尾的情况,编写字符索引函数int charAt(const string& str, int d),当字符索引大于字符长度即字符串达到结尾时,返回-1,否则返回索引字符对应的ASCII码

高位优先排序递归进行,R表示字符串的基数(字符串中不同字符的数量)。高位优先排序将字符从左向右按照字符分区间进行排序,如待排序的字符串为:

c
a
b
abc
ab

第一次递归按照最左边字符排序,结果为:

a
abc
ab
b
c

然后在以a,b,c开始的字符串中,分别按照第二位排序,直到排序完毕。

注意:键索引计数一共有4个步骤,计算频率->将频率转换为索引->数据分类->回写。其中计算频率需要用到辅助数组int count[],在低位优先排序中,这个数组的大小为R+1,加1是为了索引方便,而在高位优先中,还需要再加1,即int count[]的大小为R+2。再加1是当字符串达到末尾时,返回索引为-1,而数组的下标从0开始,故加1才能使用int count[]数组计数。此时,count[0]表示已达到末尾的字符串数目,count[1]表示字母表中第1个字符的数目……

1.高位优先字符串排序实现

#include "stdafx.h"
#include <IOSTREAM>
#include <FSTREAM>
#include <STRING>
#include <VECTOR>

const int R = 256;
const int M = 15;
using namespace std;

int charAt(const string& str, int d)
{
    if ( d < str.size() )
        return str[d];
    else 
        return -1;
}

//参数分别表示字符串容器,排序字符串起始位置,排序字符串结束位置,键的位数,辅助存储容器
void MSD_sort(<
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值