文章目录
- 📜前言
- 📜稳定性
- 📅概念
- 📅意义
- 📜八大排序稳定性分析
- 📅冒泡排序
- 📅简单选择排序
- 📅直接插入排序
- 📅希尔排序
- 📅堆排序
- 📅归并排序
- 📅快速排序
- 📜总结
📜前言
我们在学习排序的时候,接触到了稳定性这样一个名词,很多同学并不理解排序稳定性是什么意思,也不知该如何判断一个排序的稳定性。本篇博客将从稳定性的概念、稳定性的意义、八大排序稳定性的判断三个方面向大家全面讲解有关数据结构稳定性的问题。
📜稳定性
📅概念
稳定性指的是相同的数据所在的位置经过排序后是否发生变化。我们举一个例子来理解一下:
比如,一组数据存在两个5,一个标红,一个 标紫。
在我们经过某种排序之后,如果红5依旧可以在紫5的前面,则称为稳定,如果无法保证红5在紫5前面,则称为不稳定。
📅意义
刚刚我们讲解了稳定性的概念,大家可能会有一些不理解:判断排序的稳定性有什么用呢?这里我们举一个具体的场景:
- 考试排名取前三名,先交卷的成绩先进入数组;
如果成绩相同,排序方法只要能保证稳定性,那么先交卷的始终会排在前面,这样不会存在并列的情况。 - 结构体排序
排序高考成绩,按照总分排序,总分相同的再以语文成绩排序。
这里我们可以将总分和语文成绩放在一个结构体中,先按语文成绩进行排序,再选择稳定性好的排序方法按总分再一次排序,便可以实现上述需求。
📜八大排序稳定性分析
📅冒泡排序
在冒泡排序中,相同的两个数是不会进行交换的,所以冒泡排序稳定。
📅简单选择排序
简单选择排序的算法思想是从待排数组中找到最小值,再将最小值与已排好序的数组后一位进行交换。在交换过程中,如果被交换的两个数字之间存在相同的数字,就会出现不稳定的情况。
我们举一个例子吧:
这里我们发现第一个位置的5在交换之后在第二个位置的5的后面。
📅直接插入排序
直接插入排序过程中,如果是相同数字,则不会插入,这便不会破坏排序的稳定性。
📅希尔排序
希尔排序虽然是基于插入排序而设计的排序算法,但是在不同组的交换的过程中,如果在不同组之间存在相同的数字,那么在交换的过程中可能会导致相同数字的位置发生颠倒。
我们在这里简单举一个例子:
这时我们发现,原本在第一个位置的5,在进行交换之后,最后变成了第二个位置的5。说明了希尔排序不稳定。
📅堆排序
堆排序本身在建堆的过程中就无法保证数据的稳定性,而在与堆顶交换的过程中国,如果中间存在相同的数值,那么这就会破坏稳定性。
📅归并排序
归并排序只要在进行归并的过程中,将左区间的数组先赋值到辅助空间中,是可以保证稳定性的。
📅快速排序
快速排序首先选择了一个基准值,然后分别选择两个指针在数组中一个找大,一个找小,然后进行交换,所以如果在进行交换的两个指针之间存在与交换的两个数字相同的值,就会破坏稳定性 。这里我们还是举个例子来理解一下:
我们发现,这里经过快速排序之后,发现相同的2的位置发生了颠倒。说明快速排序不稳定。
📜总结
今天我们讲了排序算法中一种衡量的标准:稳定性。并且将八大排序的稳定性一一进行了分析,老铁们可以根据文中所举例子进行模拟加以理解。