数据结构8

本文详细介绍了各种排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、计数排序和桶排序。讨论了它们的时间复杂度、稳定性以及在不同数据条件下的表现。对于优化排序速度,如快速排序和归并排序的O(nlogn)复杂度,以及针对特定场景的选择,如稳定排序和空间效率,提供了深入理解。
摘要由CSDN通过智能技术生成

算法:

    排序算法的稳定性:

        在待排序的数组中,如果有值相同的数据,排序过程中如果无论如何都不会改变它们俩的前后顺序,则认为该排序算法是稳定的

        注意: 算法的时间复杂度并不能完全地代表算法的实际执行时间,有些时候看似复杂度高的算法反而速度快

        

        冒泡:

            数据左右进行比较,把最大的数据交换到最后

            特点是该算法对数据的有序性敏感,在排序过程中如果发现有序可以立即停止,如果待排序的数据基本有序时,冒泡排序的效率非常高

            时间复杂度: 最优O(n) 平均O(n^2)

            稳定

        选择:

            假定最开始的位置是最小值并记录下标min,然后与后面的数据比较,如果有比min下标的数据小,则更新min,最后如果min的值发生改变,则交换min为下标的数据与最开始位置的数据

            虽然时间复杂度高,但是特点是交换次数少,因此实际的运行速度并不慢,是冒泡排序的一种变种,但是对数据的稳定性不敏感,因此数据比较混乱时比冒泡快[10,10,1]

            时间复杂度: O(n^2)

            不太稳定

        插入:

            把数据看成两部分,一部分是有序的,把剩余部分的数据逐个插入进去,直到插完就全部有序了

            适合对已经排序好的数据,新增数据并重新排序

            时间复杂度: O(n^2)

            稳定

        希尔:

            是插入排序的升级版,由于插入排序时,数据移动的速度比较慢,所以增加了增量的概念,以此提高排序的速度,数据量越多,插入的速度越快

            时间复杂度: O(n^2)

            不稳定

        快速:

            找到一个标杆,备份标杆的值,一面从左边找比标杆大的值,然后把找到的数值赋值给标杆位置,更新标杆的位置到左标杆处,从右边找比标杆值小的数据,如果找到也把数据赋值给标杆位置,更新标杆的位置到右标杆处,重复以上过程,知道左右标杆相遇,最后在相遇处还原标杆的值,最终达到标杆左右两边整体有序,然后按照同样的方法排序左右部分,最终全部有序

            它的综合性能最高,因此叫做快速排序,笔试中考得比较多

            时间复杂度: O(nlogn)

            不稳定

        归并:

            先把待排序的数据拆分成单独的个体,然后按照从小到大的顺序合并并复制到临时内存中,最终全部合并结束后再从临时内存赋值给原内存

            由于需要使用额外的内存空间,因此避免数据交换时的耗时,是一种典型的用空间换时间的算法

            时间复杂度: O(nlogn)

            稳定

        堆:

            把数据当做完全二叉树,然后把树调整成大顶堆,再把根节点的数据交换到最后,然后数量-1,然后剩余部分重新调整成大顶堆,重复以上步骤,直到数量为1时结束

            时间复杂度: O(nlogn)

            不稳定

        计数:

            先找出数据中的最大值、最小值,根据最大、小值关系创建哈希表,用(最大值-最小值+1)作为哈希表的长度,使用(数据-最小值)作为哈希表的下标来访问哈希表并标记+1,然后遍历哈希表,当表中的值非零时,把该 下标+最小值 还原回原来的数据依次放回原数组中,最终排序完成

            是一种典型的用空间换时间的算法,该算法理论上速度可以非常快,但是有很大的局限性,适合排序整型数据,而且数据的差值不宜过大,否则会非常浪费内存,适合数据较为平均,重复数较多时排序

            时间复杂度: O(n+k) k是整数的范围

            稳定

        桶:

            把数据根据值的范围,存储到不同范围的桶中,然后调用其它的排序算法,对桶中的数据进行排序,排序结束后再拷贝回原数据中,以此降低排序规模来降低排序的时间,是一种典型的以空间换时间的算法

            缺点: 如何分桶、桶的范围定义多大,这些都需要对数据有一定的了解

            时间复杂度: O(n+k)

            稳定

        基数:

            是桶排序的具体实现,首先创建10个队列,然后逆序计算出数据的个十百...位,然后按照每位对应的数据压入对应的队列中,某位入队结束后,按照队列顺序出队存储回原数组中,然后继续重复操作下一位,直到下标为0的队列有len个数据,排序结束

            缺点: 只适合存储正整数数据,队列的空间要很大

            时间复杂度: O(n+k)

            稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值