稳定性解释:
一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4,1)(3,1)(3,7)(5,6)在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:
(3,1)(3,7)(4,1)(5,6) (维持次序)
(3,7)(3,1)(4,1)(5,6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
冒泡排序是稳定的,算法时间复杂度是O(n ^2)。
2.2 选择排序(Selection Sort)
选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 选择排序是不稳定的,算法复杂度是O(n ^2 )。
2.3 插入排序 (Insertion Sort)
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i] 又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。 直接插入排序是稳定的,算法时间复杂度是O(n ^2) 。
2.4 堆排序
堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 堆排序是不稳定的,算法时间复杂度O(nlog n)。
2.5 归并排序
设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。 其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。
2.6 快速排序
快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。 快速排序是不稳定的,最理想情况算法时间复杂度O(nlog2n),最坏O(n ^2)。
2.7 希尔排序
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。 希尔排序是不稳定的,其时间复杂度为O(n ^2)。
相关推荐
### 排序算法的稳定性和时间复杂度小结 #### 一、引言 排序算法是计算机科学中的基本算法之一,广泛应用于各种场景之中。排序算法不仅关注排序的速度(时间复杂度),还关注排序过程中是否能够保持相等元素原有的...
稳定性和时间复杂度是评估排序算法性能的两个关键指标。 【稳定排序算法】指的是在排序过程中,相等元素的相对顺序不会改变。例如,冒泡排序、插入排序、归并排序和基数排序都是稳定的。冒泡排序通过相邻元素的比较...
【排序算法稳定性与时间复杂度概述】 排序算法是计算机科学中的基本操作,主要目标是将一组数据按照特定顺序排列。稳定性是指排序过程中相等元素的相对顺序不会改变。稳定性对于某些应用非常重要,例如处理多个键的...
各种排序算法的稳定性和时间复杂度小结.doc
【排序算法概述】 排序算法是计算机科学中的重要组成部分,用于对一组数据进行排列,使其按照特定顺序呈现。...在学习排序算法时,不仅要看算法的效率,还要关注其稳定性和空间复杂度,以及在特定条件下的表现。
7. **交换排序和选择排序**:这两者都是基于交换元素的O(n^2)复杂度的排序算法,效率与冒泡排序相当,但在实际应用中较少使用。 8. **基数排序**:基数排序是针对整数的排序,通过按照每一位的值进行排序,从低位到...
总结各种排序算法的特性,我们可以根据数据规模、是否需要稳定性、可用空间等因素来选择合适的排序算法。在大多数情况下,快速排序、归并排序和堆排序是常用的选择,而插入排序、冒泡排序等则更适合小规模或特定条件...
5. 冒泡排序(Bubble Sort)和鸡尾酒排序(Cocktail Sort):两者都是稳定的排序算法,时间复杂度为O(n^2)。冒泡排序通过相邻元素的交换逐步将最大(或最小)元素移到序列末尾。鸡尾酒排序是冒泡排序的变种,双向...
### 排序算法小结讲解+源码 #### 一、引言 排序算法作为计算机科学中的基础且常用算法,在实际应用中具有重要意义。随着数据量的不断增加,对排序算法的效率提出了更高要求。本文将从简单排序算法出发,逐步过渡到...
简单排序算法如冒泡排序和选择排序虽然实现简单且易于理解,但由于其较高的时间复杂度,在处理大规模数据时效率低下。接下来的部分我们将探讨更高效的排序算法。 #### 第二部分:高级排序算法 这部分将介绍更高效的...
归并排序的优点在于其稳定性和较好的最坏情况性能。 ### 总结 通过对上述五种排序算法的性能比较,我们可以看到不同算法各有优劣。例如,插入排序适合小规模或部分有序的数据;冒泡排序虽然简单但效率不高;简单...
平均和最坏情况下的时间复杂度都是O(n^2),空间复杂度为O(1),它是稳定的排序算法。 - **折半插入排序**:改进了直接插入排序,通过二分查找确定插入位置,减少了比较次数,但时间复杂度仍为O(n^2),保持稳定性。 ...
这个实验旨在深入理解各种排序算法的时间复杂度,并通过实际操作来验证这些理论知识。我们将探讨以下几种常见的内排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序。 **冒泡排序**是一种简单...
本篇文章将详细解析Java中常见的排序方法,结合"javaeye 收集的java排序小结"资料,旨在帮助读者理解和掌握这些排序算法。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较...
这表明任何基于比较的排序算法的最坏情况下的时间复杂度至少为Ω(n log n)。 ### 第3章 - 增长阶函数 #### 3.1 渐进记号 - **3.1-1**:定义并理解大O、小o、θ、Ω和ω记号。 - **3.1-2**:比较不同渐进记号之间...
时间复杂度为 O(n^2),空间复杂度为 O(1),稳定性较好。适用于小规模数据排序。 ```cpp void insertSort(comparable* array, int length) { for (int i = 1; i ; i++) { comparable temp = array[i]; int j =...
- **稳定性**:排序算法的稳定性是指相等元素之间的相对位置是否会被保持。冒泡排序是稳定的,而交换排序则是不稳定的。 通过对以上知识点的详细解析,我们可以更深入地理解这些基础排序算法的工作原理及其在实际...