【每日算法】排序算法总结(复杂度&稳定性)

一、插入排序:稳定,时间复杂度O(n^2)

想象你在打扑克牌,一开始左手是空的,接着右手开始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们需要从右到左将它与手中的牌比较,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。

详见: 插入排序

二、选择排序:不稳定,时间复杂度O(n^2)

每趟从未排序部分选出最小的元素,然后通过交换将其添加到已排序部分中。

详见: 选择排序

三、冒泡排序:稳定,时间复杂度O(n^2)

将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理两遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。

详见: 冒泡排序

四、归并排序:稳定,时间复杂度 O(nlog n),空间O(n)

分解:将n个元素分成各含n/2个元素的子序列;

解决:用归并排序法对两个子序列递归地排序;

合并:合并两个已排序的子序列以得到排序结果。

合并思想:

桌面上有两堆已排好序的牌(比如最上面的牌最小),牌面朝上。我们的任务是将两堆牌合并成一堆有序的牌。

下面开始取牌:从两堆牌顶上的两张牌中选取较小的一张,将其取出,面朝下放到输出堆中。如果反复取牌直到其中一堆牌为空,接下来只要把剩下那堆牌(如果有的话)的所有牌都取出并放到输出堆中即可。

详见: 归并排序

五、堆排序:不稳定,时间复杂度 O(nlog n)

堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最大的元素。

详见: 堆排序

六、快速排序:不稳定,时间复杂度 平均O(nlog n),最差O(n^2),空间O(log n)->递归的栈空间

快排基于分治模式,其基本思想:

分解:从序列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,从而得到两个子序列。

解决:递归调用快速排序,对两个子序列进行排序。

合并:因为子序列是就地排序的,所以合并不需要任何操作。

详见: 快速排序

七、希尔排序:不稳定,时间复杂度 平均O(nlogn),最差O(n^s) 1 < s < 2

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先取某个增量d,所有距离为d的倍数的记录放在同一个组中。先在各组内进行直接插入排序,然后再用一个较小的增量对它分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

八、计数排序:稳定,线性时间

计数排序假设n个输入元素都是0到k之间的整数,基本思想是对每个元素x,确定出小于x的元素个数,之后便可以将x直接放到合适的位置。(需注意元素相等的情况)

详见: 计数排序

八、基数排序:稳定,线性时间

我们要对一副扑克牌排序,可以这样做:先不管牌的大小,先对花色(比如红桃、黑桃、方块、梅花)排序,之后再根据牌的大小排序,于是一副牌就按花色、大小排好了。

对于数字,我们可以先对最低位排序,再对次低位排序。。最后对最高位排序。

详见: 基数排序

八、桶排序:稳定,线性时间

假设所有元素均匀分布在区间[0,1)上,将该区间划分成n个相同大小的子区间(称为桶),之后,将相应的元素放到对应范围的桶里面,对各个桶里的元素进行排序,最后按次序把各个桶里的元素列出来即可。

桶排序很快,大多时候比快排还快,不过很耗费空间。

详见: 桶排序

各个算法都有其适用的情况,所以没有绝对的优劣之分,具体问题要具体分析。要是有人问你,哪个排序算法最好,千万别往坑里跳。o(^▽^)o



下面提一下一些有趣的排序:

位图排序

(以下是并行化的排序算法)

双调排序(Bitonic Sort)

奇偶排序(Odd-even Sort)

采样排序(Sample Sort)



每天进步一点点,Come on!

(●’?’●)


本人水平有限,如文章内容有错漏之处,敬请各位读者指出,谢谢!

时间: 2024-10-12 08:28:38

【每日算法】排序算法总结(复杂度&稳定性)的相关文章

数据结构与算法-排序算法-partial

前言 都什么时代了,还写排序算法的总结? 原因有二.一是别人的精彩永远是别人的,你只有鼓掌的份儿:有些事情实际动手去做了才会有所体会. 二是排序算法是一类基础类的算法,不光是IT从业者真正入门的门槛,也是一些高级算法的关键部分或算法评估的benchmark. 计划说明的算法内容有哪些?  算法的思想.Java代码实现和平均算法复杂度.算法运行完整示例. 参考文献有哪些? wiki[EB/OL] Shaffer C. A. Data Structure and Algorithm Analysis

数据结构和算法-排序算法-冒泡排序

##################     排序算法        ###################### """ 排序算法, 我们想要把线性表中的无序序列,排成有序序列,的算法,就是排序算法, 排序算法的稳定性 举例:假设对下面的元组要以他们的第一个数字来排序. (4, 1) (3, 1) (3, 7)(5, 6) 如果你排序之后,(3, 1) (3, 7)和原来的顺序一样,就是稳定的,否则就是不稳定的, (3, 1) (3, 7) (4, 1) (5, 6) (维

算法 - 排序算法的稳定性

排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变. 可以: 冒泡排序遇到相等的数不交换即可做到稳定. 插入排序,遇到相等的数即停止比较,插入数组. 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定. 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打乱原始的次序. 随机快排不具有稳定性,因此荷兰国旗问题也是不能做到稳定性的. 堆排序. 稳定性的意义: 现实工程中需要保持上一次排序时遗留的信息,比如学校的成绩排序,第一次查询以成绩高低排序,第二次查

《算法 - 排序算法》

一:参考 - 十大经典排序算法动画与解析,看我就够了!(配代码完全版) - 这个动画很形象了,自己也对排序算法重新总结了下(PHP版本) - Github Sort 二:算法详解 <?php /** * https://www.cnblogs.com/fivestudy/p/10212306.html * 排序算法 时间复杂度 最优 最差 稳定性 * 冒泡排序 O(n^2) O(n) O(n^2) 稳定 * 选择排序 O(n^2) O(n^2) O(n^2) 不稳定 * 插入排序 O(n^2)

JavaScript算法-排序算法

? 此生之路,我将走过:走过这一次,便再也无法重来.所有力所能及的善行,所有充盈于心的善意,我将毫不吝惜,即刻倾予.我将再不拖延,再不淡漠,只因此生之路,再也无法重来. 对计算机中存储的数据执行的两种最常见操作是排序和索引.下述阐述的排序方式,暂且都是用数组进行测试(从小到大). var dataAry = [5, 4, 3, 7, 1, 2, 8, 6, 9]; // 测试数组 /** *[工具方法]交换数组中两个值 * @param ary 数组 * @param i 下标i * @para

数据结构与算法——排序算法

常见排序算法主要有: 插入排序(直接插入排序.希尔排序) 选择排序(直接选择排序.堆排序) 交换排序(冒泡排序.快速排序) 归并排序 基数排序 外部排序 一.直接插入排序 算法思想:在一个待排序列中,从第二个元素开始,依次进行排序,每次都将待排序元素从后往前,依次与前面的元素进行比较,从而将带排序元素移动到一个合适的位置,直到最后一个待排序元素移动到合适位置,则排序完成. 算法特点:最好情况下时间复杂度O(n),最坏情况下时间复杂度O(n2),稳定排序算法 二.希尔排序 希尔排序算法基础:待排序

[数据结构与算法]排序算法(Python)

1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def insert_sort(arr): length = len(arr) for i in range(1,length): if arr[i] < arr[i-1]: for j in range(i-1,-1,-1): if arr[j+1] < arr[j]: arr[j+1],arr[j] = arr

算法 排序算法--冒泡排序

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中. “冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. 这里以从小到大排序为例进行讲解. 基本思想及举例说明 冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移.经过一轮比较,就选出最大的数:经过第2轮比较,就选出次大的数,以此类推. 下面以对 3  2  4  1 进行冒泡排序说明. 第一轮 排序过程3  2  4  1    (最初)2  3  4  2    (比较3和2,

算法 排序算法--选择排序

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置)3  2  4  1(最初, mi

数据结构与算法---排序算法(Sort Algorithm)

排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进行排序. 2) 外部排序法:数据量过大,无法全部加载到内 存中,需要借助外部存储(文件等)进行 排序. 常见的排序算法分类 算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 1.事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序: 二是所