归并排序和基数排序

聊聊归并排序和基数排序,以及一些其他排序算法。
归并排序
想象一下,你有一堆乱七八糟的扑克牌,你把它们分成两堆,每堆都自己排好序,然后再把这两堆合起来,排成一堆。归并排序就是这么干的。它先把一大堆东西分成小堆,每堆自己排好序,然后再两两合并,直到最后变成一个整齐的大堆。这个算法的好处是它很稳定,不会把原来一样的东西搞乱了顺序。
基数排序
这个算法有点像是给数字分类。比如,你先把所有数字的个位数排好序,再把所有数字的十位数排好序,依此类推,直到所有位数都排好序。你可以从最高位开始排,也可以从最低位开始排,两种方法都可以。基数排序的好处是它不需要比较数字的大小,所以有时候会比较快。


其他排序算法
直接插入排序:就像你在整理书架上的书,每次拿一本,然后找到它应该放的位置。
简单选择排序:就像你在一堆东西里找最大的,拿出来,再找剩下的最大的,再拿出来,直到全部拿出来。
冒泡排序:就像吹泡泡,每次把最大的泡泡吹到最上面去,然后再吹剩下的泡泡。
快速排序:这个算法很聪明,它先随便拿一个东西,然后把比它小的都放到左边,比它大的都放到右边,然后再对左右两边分别这么做,很快就能排好序。
堆排序:这个算法是把东西堆成一个特殊的堆,然后再一点点地把堆顶的东西拿出来,放到堆的末尾,同时保持堆的特性。
存储结构
如果你要排序的东西很大,比如大文件或者大图片,那么用链表来存储这些东西会比较好,因为链表在移动东西的时候不需要把整个东西都搬来搬去,只需要改改链接就可以了。

知识点链接
归并排序
实现过程:归并排序是一种分治算法,它将一个大的排序问题分解成多个小的子问题来解决。首先将待排序的n个记录视为n个长度为1的有序子表。然后,这些子表两两归并,形成⌈n/2⌉个长度为2或1的有序表。这个过程重复进行,直到最终合并成一个长度为n的有序表。
性能分析:
空间复杂度:O(n),因为需要额外的空间来存储合并过程中的元素。
时间复杂度:归并排序的时间复杂度是O(n log n),这是因为它将问题分解成log n层,每层有n个元素需要合并。
稳定性:归并排序是稳定的排序算法,即相等的元素在排序后保持原来的相对顺序。
基数排序
基本概念:
最高位优先(MSD)法:从关键字的最高位开始,逐步向下进行排序,直到最低位。
最低位优先(LSD)法:从关键字的最低位开始,逐步向上进行排序。
实现过程:基数排序利用分配和收集操作,基于关键字的每一位进行排序。这个过程重复进行,直到所有关键字的每一位都被排序。
性能分析:
空间复杂度:O(r),其中r是基数,即关键字的最大位数。需要r个队列来存储分配过程中的元素。
时间复杂度:O(d(n+r)),其中d是关键字的位数,n是元素数量。每趟分配需要O(n),收集需要O(r)。
稳定性:基数排序也是稳定的排序算法。
内部排序算法的比较及应用
直接插入排序:适用于n较小的情况,或者记录本身信息量较大时。
简单选择排序:适用于记录信息量大的情况。
冒泡排序:适用于文件初始状态已基本有序的情况。
快速排序:在关键字随机分布时,平均时间最短,是当前基于比较的内部排序方法中最好的方法之一。
堆排序:适用于n较大的情况。
归并排序:当需要排序稳定且时间复杂度为O(n log n)时选用。
基数排序:适用于n很大,记录的关键字位数较少且可以分解时。
存储结构
当记录本身信息量较大时,为了避免在排序过程中耗费大量时间移动记录,可以使用链表作为存储结构。
这些排序算法各有优势和适用场景,选择合适的排序算法取决于具体问题的规模、数据特性和性能要求。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值