`
anna_zr
  • 浏览: 200604 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

线性链表的应用----箱排序和基数排序

阅读更多
箱排序和基数排序均属于分配排序。

分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O(n)。

一、箱排序(Bin Sort)

1、箱排序的基本思想
     箱排序也称桶排序(Bucket Sort),其基本思想是:设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1],把关键字等于k的记录全都装入到第k个箱子里(分配),然后按序号依次将各非空的箱子首尾连接起来(收集)。

2、箱排序中,箱子的个数取决于关键字的取值范围。
     若R[0..n-1]中关键字的取值范围是0到m-1的整数,则必须设置m个箱子。因此箱排序要求关键字的类型是有限类型,否则可能要无限个箱子。

3、箱子的类型应设计成链表为宜
     一般情况下每个箱子中存放多少个关键字相同的记录是无法预料的,故箱子的类型应设计成链表为宜。

4、为保证排序是稳定的,分配过程中装箱及收集过程中的连接必须按先进先出原则进行。
(1) 实现方法一
     每个箱子设为一个链队列。当一记录装入某箱子时,应做人队操作将其插入该箱子尾部;而收集过程则是对箱子做出队操作,依次将出队的记录放到输出序列中。

(2) 实现方法二
     若输入的待排序记录是以链表形式给出时,出队操作可简化为是将整个箱子链表链接到输出链表的尾部。这只需要修改输出链表的尾结点中的指针域,令其指向箱子链表的头,然后修改输出链表的尾指针,令其指向箱子链表的尾即可。

5、算法简析
     分配过程的时间是O(n);收集过程的时间为O(m) (采用链表来存储输入的待排序记录)或O(m+n)。因此,箱排序的时间为O(m+n)。若箱子个数m的数量级为O(n),则箱排序的时间是线性的,即O(n)。
  注意:
     箱排序实用价值不大,仅适用于作为基数排序的一个中间步骤。

例:对学生成绩排序。

public void binsort(int range){
ChainNode [] bottom = new ChainNode[range+1];
ChainNode [] top = new ChainNode[range+1];

//distribute to bins
for(; firstNode != null; firstNode = firstNode.next){
//add the element to a bin
int theBin = ((ScoreObject)firstNode.element).score;
if(bottom[theBin] == null){
bottom[theBin] = top[theBin] = firstNode;
}else{
top[theBin].next = firstNode;
top[theBin] = firstNode;
}
}

//collect from bins into sorted chain
ChainNode y = null;
for(int theBin=0; theBin <= range; theBin++){
if(bottom[theBin] != null){
if(y == null){
firstNode = botton[theBin];
}else{
y.next = bottom[theBin];
}
y = top[theBin];
}
if(y != null){
y.next = null;
}
}

}

二、基数排序

基数排序(Radix Sort)是对箱排序的改进和推广。

1、单关键字和多关键字
     文件中任一记录R[i]的关键字均由d个分量构成。
若这d个分量中每个分量都是一个独立的关键字,则文件是多关键字的(如扑克牌有两个关键字:点数和花色);否则文件是单关键字的,(0≤j<d)只不过是关键字中其中的一位(如字符串、十进制整数等)。
    多关键字中的每个关键字的取值范围一般不同。如扑克牌的花色取值只有4种,而点数则有13种。单关键字中的每位一般取值范围相同。

2、基数
      设单关键字的每个分量的取值范围均是:
      C0≤kj≤Crd-1(0≤j<d)
可能的取值个数rd称为基数。基数的选择和关键字的分解因关键宇的类型而异:
(1) 若关键字是十进制整数,则按个、十等位进行分解,基数rd=10,C0=0,C9=9,d为最长整数的位数;
(2) 若关键字是小写的英文字符串,则rd=26,Co='a',C25='z',d为字符串的最大长度。

3、基数排序的基本思想
     基数排序的基本思想是:从低位到高位依次对Kj(j=d-1,d-2,…,0)进行箱排序。在d趟箱排序中,所需的箱子数就是基数rd,这就是"基数排序"名称的由来。

4、基数排序的排序过程
     要排序的记录关键字取值范围是0到99之间的整数(36,5,16,98,95,47, 32,36,48)。对这些关键字进行基数排序的过程。

5、基数排序的类型说明和算法描述
     要保证基数排序是正确的,就必须保证除第一趟外各趟箱排序是稳定的。相应的类型说明及算法描述【参见教材】。

6、算法分析
     若排序文件不是以数组R形式给出,而是以单链表形式给出(此时称为链式的基数排序),则可通过修改出队和人队函数使表示箱子的链队列无须分配结点空间,而使用原链表的结点空间。入队出队操作亦无需移动记录而仅需修改指针。虽然这样一来节省了一定的时间和空间,但算法要复杂得多,且时空复杂度就其数量级而言并未得到改观。
     基数排序的时间是线性的(即O(n))。
     基数排序所需的辅助存储空间为O(n+rd)。
     基数排序是稳定的。

分享到:
评论

相关推荐

    Radix Sort (基数排序)排序算法

    当d和r固定时,基数排序的时间复杂度接近线性。 - **空间复杂度**:基数排序的空间复杂度为O(n + k),其中n是元素数量,k是桶的数量。 #### 六、适用场景与局限性 基数排序适用于大数据量且数字位数固定的场景,...

    java基数排序

    在实际应用中,基数排序的时间复杂度是线性的,即O(kn),其中k是数字的最大位数,n是数组的长度。这使得它在处理大量数据时表现优异,尤其是在数据位数已知且位数差距较大的场景下。 总结来说,Java中的基数排序是...

    c 基数排序

    3. **时间复杂度分析**:基数排序的时间复杂度是线性的,即O(n),这是因为每个位数的分布和收集操作都是线性的,而这个过程总共需要进行`L`次(L为最大数字的位数),所以总的时间复杂度是O(d * (n + rd)),其中d是...

    桶排序-解决排序问题

    桶排序(Bucket Sort)是一种分布式排序算法,常用于大数据处理和流式计算中。...在学习和实践中,我们还可以深入研究如何结合其他排序算法,比如计数排序、基数排序等,以适应更复杂的数据排序需求。

    基数排序PPT学习教案.pptx

    基数排序是一种特殊的排序算法,它的核心思想是利用数字的位数进行排序,尤其适用于处理具有固定长度数字的排序问题。这种排序方法是基于多关键字排序的理论...在实际应用中,基数排序常用于数据库和大型数据处理领域。

    数据结构算法与应用-C++语言描述(3)

    在排序算法方面,书中的应用部分重点介绍了二叉排序和基数排序。这两种排序方法在特定条件下(关键值位于一个“合适”的范围内)可以达到线性时间复杂度,即O(n),相比起第2章中介绍的O(n^2)时间复杂度的排序算法,...

    数据结构和算法-思维导图.pdf

    - 线性辅助空间复杂度,例如在进行原地排序算法时,如冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、基数排序和计数排序。 2. **排序算法**: - 各种排序算法如冒泡排序、选择排序、插入...

    算法-基础算法- 排序算法(包含源程序).rar

    8. 计数排序、桶排序和基数排序:这三种是线性时间复杂度的非比较排序算法,适用于特定类型的数据,如整数排序。它们不是比较元素之间的大小,而是利用数据特性进行排序。 了解并掌握这些排序算法有助于提升编程...

    数据结构、算法与应用--C++语言描述

    3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array1D 131 ...

    数据结构算法与应用-C++语言描述(单文件含目录版)

    - **基数排序**:讲解了基数排序算法及其工作原理。 - **等价类**:解释了等价类的概念及其应用场景。 - **凸包**:介绍了凸包问题及其解决方案。 **第4章 数组和矩阵** 1. **数组** - **抽象数据类型**:介绍...

    数据结构算法与应用-C__语言描述

    3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array1D 131 ...

    数据结构算法与应用-C C++语言描述

    3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array1D 131 ...

    数据结构-C语言版:DS09-排序.ppt

    2. **内部排序的策略划分**:包括**插入排序**、**选择排序**、**交换排序**(如冒泡排序和快速排序)、**归并排序**和**基数排序**。 【评价排序算法的标准】: 1. **时间效率**:算法执行所需的时间,通常以时间...

    算法导论答案

    - **8.3-5** 基数排序的应用场景。 ### 8. 第9章:优先队列 第九章探讨了优先队列及其在算法设计中的应用。 #### 9.1 优先队列的定义 - **9.1-1** 优先队列的基本概念。 - **9.1-2** 优先队列的操作接口。 #### ...

    数据结构与算法题解

    - **基数排序(RadixSort)** - 一种非比较型整数排序算法,其效率高于比较排序。 - 实例问题:对一个整数数组进行排序。 **3. 基础算法** - **分治算法(DivideandConquer)** - 把一个复杂的问题分成两个或更多的...

    数据结构算法与应用-C++语言描述.rar

    3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array...

    数据结构算法与应用-C++语言描述

    3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array1D 131 ...

Global site tag (gtag.js) - Google Analytics