前言
数据结构排序算法
一、排序算法
排序是算法的稳定性:
在待排序的数组中,如果有值相同的数据,排序过程中如果无论如何都不会改变它们的前后顺序,则认为该排序算法是稳定的
冒泡:
数据左右进行比较,把最大的数据交换到最后
特点是该算法对数据的有序性敏感,在排序过程中如果发现有序可以立即停止,如果待排序的数据基本有序时,冒泡的排序的效率非常高。
时间复杂度:最优:O(n) 平均:O(n^2)
稳定的
选择:
假定最开始的位置是最小值并记录下标min,然后与后面的数据比较,如果有比min下标的数据小,则更新min,最后如果min的值发生变化,则交换min为下标的数据与最开始位置的数据
虽然时间复杂度高,但是特点是交换次数少,因此实际的运行速度并不慢
是冒泡的一种变种,但是对数据的的有序性不敏感,因此数据较混乱时比冒泡快
时间复杂度:O(n^2)
不稳定 [10 10 1]
插入:
把数据看成量部分,一部分有序的,把剩余部分的数据逐个插入进去,直到插完就全部有序。
时间复杂度:O(n^2)
适合对已经排序好的数据,新增数据并重新排序
稳定的
希尔:
是插入排序的升级版,由于插入排序时,数据移动的速度比较慢,所以增加了增量的概念,以此提高排序的速度,数据量越多,比插入的速度快
时间复杂度:O(n^2)
不稳定的
快速:
找到一个标杆,备份标杆的值,一面从左边找比标杆大的数据,然后把找到的数据赋值给标杆位置,更新标杆的位置到左标杆处,再从右边找比标杆小的数据,然后把找到的数据赋值给标杆位置,更新标杆的位置到右标杆处,重复以上过程,直到左右标杆相遇,最后再相遇处还原标杆的值,最终达到标杆左右两边整体有序,然后按照同样的方法排序左右部分,最终全部有序。
它的综合性能最高,因此叫做快速排序,笔试中考得比较多的排序算法
时间复杂度:O(nlogn)
不稳定的
归并:
先把待排序的数据拆分成单独的个体,然后按照从小到大的顺序合并复制到临时内存中,最终全部合并结束后,再赋值给原内存。
由于需要使用额外的内存空间,因此避免了数据交换时的耗时,也是一种典型的用空间换时间的算法
时间复杂度:O(nlogn)
稳定的
堆:
把数据当作完全二叉树,然后把树调整成大顶堆,再把根节点的数据交换到最后,然后数量-1,然后剩余部分重新调整成大顶堆,重复以上步骤,直到数量为1时结束
时间复杂度哦O(nlogn)
不稳定的
计数:
先找出数据中的最大值、最小值,创建哈希表,用最大值-最小值作为哈希表的长度,使用数据-最小值作为哈希表的下标访问哈希表并标记+1,然后遍历哈希表,当表中的值非0时,把该下标+最小值还原回原点的数据依此放回原数组中,最终排序完成。
是一种典型的空间换时间的算法,该算法理论上速度可以非常快,但是有很大的局限性,适合排序整型数据,而且数据的差值不宜太大,否则会非常浪费内存,适合数据较为平均,重复较多排序
时间复杂度O(n+k)
稳定的
桶:
把数据根值的范围,存储到不同范围的桶中,然后调用其他的排序算法,对桶中的数据进行排序,排序结束后再拷贝回原数组中,以此降低排序的时间,是一种典型的以空间换时间的算法。
缺点:如何分桶,桶的范围定义多大,这些都需要对数据有一定了解
时间复杂度O(n+k)
稳定的
基数:
是桶排序的具体实现,首先创建10个队列,然后逆序计算出数据的个十百...位,然后按照每位对应的数据压入对应的队列中,某位入队结束后,按照队列顺序出队存储桶原数组中,然后继续重复操作下一位,直到下标为0的队列有len分数据,排序结束。
缺点:只适合存储正整数数据,队列的空间要很大
时间复杂度:O(n+k)
稳定的w
总结
以上,有错误,还请指正