对字符串使用基数排序,以前,我一直觉得:因为字符串的长度不一,无法使用基数排序。前两天因为有需要,忽然想通了!即便长短不一,也可以使用链式基数排序!
首先,将字符串长度当作最低有效位,因为基数排序是从最低有效位开始排的,就先用分配-收集算法对长度做一趟。对字符串中的具体某一位字符进行排序相比,算法是一样的,只是写法稍有不同。要将排序结果的lenRadix指针保存起来,后面要用。
接下来,从lenRadix中取字符串最长的那个sublist,对该sublist排序,然后将这一趟的结果first保存起来,连接到长度次短的那个sublist之后,然后对这两个链接起来的列表进行一趟分配-收集。如此,直到最高有效位。
所有的工作就做完了,根据此算法,对所有待排序字符串中的每个字符,均需要一次且仅一次访问!另外,还需要O((radix+1)*max_str_len)的时间复杂度用于扫描链接表,(radix+1)是因为还有一个strlen链接表。所以,总的时间复杂度是O(n+(radix+1)*max_str_len),其中N是所有字符串的总字符数。
在排序过程中,可以插入一个codetab,来实现不同的排序准则(例如忽略大小写),如果提供了wchar_t codetab,就按 wchar_t 排序,如果wchar_t codetab 非 NULL,就按转换了的 wchar_t 排序。
如果对unicode排序,最好指定一个codetab,把radix变小,不然的话,时间复杂度就太大了!
经过测试,在大约20000~30000个字符串的情况下,比std::sort快5~7倍。数据规模再增大,至5,000,000个字符串时,比std::sort大概快1.8~2.5倍!
代码:
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/radix_sort.cpp
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/radix_sort.h
测试(bench mark)代码:
http://code.google.com/p/febird/source/browse/trunk/febird/codelite/RadixSort/main.cpp
分享到:
相关推荐
基数排序是一种非比较型整数排序算法,适合处理包含多个字符的字符串。它的思想是按照字符串的每一位进行排序,从最低位到最高位。对于字符串,我们可以将其转换为数字,然后利用基数排序的特性。首先,按照字符串...
在C#中,基数排序可以应用于字符串排序,尤其适合处理包含数字的字符串,因为它能按照数字的每一位进行排序。由于基数排序的时间复杂度是O(k·n),其中k是字符串的最大长度,n是元素个数,所以它在处理大量数据且...
6. **性能优化**:对于大量字符串的排序,可以考虑使用基数排序,它基于每一位进行排序,适用于长度不一的字符串。另外,可以利用字符串的特性,如前缀匹配,来优化比较过程。 7. **内存与时间复杂度**:排序算法的...
基数排序通过按位(这里指字符串的每一位字符)进行分配和收集的过程来达到排序的目的。在代码中,`Distribute()`函数负责将字符串分配到对应的链表,`Collect()`函数则将这些链表重新组合成排序后的字符串数组。...
由于整数也可以表示字符串、卡片等数据(当成是整数即可),所以基数排序并不限于整数。它是一种分配排序,将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序是由E. R. Radix发明的,所以也叫基数...
LSD 算法是一种基于基数排序的字符串排序方法,它从字符串的最低位开始排序,逐步向高位推进。首先,确保所有字符串具有相同的长度。算法主要包括以下步骤: - 计算每个字符的出现频率。 - 将频率转换为索引,创建...
本文将深入探讨在C++中实现的七种排序算法:冒泡排序、插入排序、快速排序、归并排序、堆排序、计数排序和基数排序,并讨论如何应用它们对字符串和整数进行排序。这些算法在不同的场景下有不同的效率和适用性,理解...
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序并不是只能用于整数。在计算机科学中,基数排序被广泛应用于各种场景,特别是在处理大量数据的情况下,它能够提供非常高效的排序性能。 ...
8. **基数排序**:基于数字位的排序,适合于字符串长度不一,但字符串由相同位数的数字组成的情况,例如电话号码。 在解决华为OD题库中的字符串排序问题时,还需要注意以下几点: 1. **处理空字符串**:空字符串在...
### 时间整数格式基数排序及转换为字符串形式 在计算机科学中,基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数进行比较。基数排序通常用于那些不是通过比较元素大小来...
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也可以用于非整数的数据类型。 基数排序通常用于大数据量的排序,特别是在数据分布均匀的情况下表现优秀。它是一种线性时间复杂度的...
更复杂的字符串排序可能需要使用特定的排序算法,如基数排序,它按字符逐位进行排序,适用于长度相同或可预知长度的字符串。 在实际应用中,选择哪种排序算法取决于数据特性和需求。例如,如果内存空间有限,快速...
它通常用于处理整数或固定长度字符串等数据类型。 - **链表**:链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表非常适合动态地添加和删除元素。 ### 链式基数排序概述 ...
对长度为 1 的字符串基数排序利用上一次 sa 的结果,对第一关键字排序对第一关键字基数排序利用 sa 值求 rank 值,cmp 函数用来判断字符串相等。j 代表当前字符串长度;p 相当于当前不同长度字符串的个数;m 为基数...
基数排序适用于固定长度的数字或字符串排序,尤其适用于小到中等规模的数据集,例如在3D引擎中处理大量数据时。 #### 基本概念 1. **基本思想**:基数排序不直接比较元素,而是通过多次分配和收集的过程来排序。...
由于整数也可以表示字符串(如将数字转换为字符串形式),所以基数排序也可以很自然地扩展到字符串排序中。 这里提供一个基于LSD(Least Significant Digit,最低位优先)的基数排序算法实现,用于对整数进行排序。...
基数排序可以用于对整数或字符串进行排序,因为它实际上是对每个数字位进行排序,而不是直接比较数值大小。 工作原理 基数排序的核心思想是将整数按位数分割成不同的数字,然后按每个位数分别比较。具体步骤如下: ...
倍增算法具有较优的时间复杂度,尤其是当结合其他排序算法(如基数排序)使用时,可以达到O(n)的时间复杂度,其中n是字符串的长度。本论文中介绍的倍增算法代码简洁,仅需25行即可实现。 1.3 DC3算法 DC3算法...