小白学算法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(<