作者:几冬雪来
时间:2023年4月14日
内容:数据结构排序内容归纳总结
目录
前言:
很快的我们数据结构的排序板块就已经接近尾声了,今天我们就来总结一下从数据结构排序开始到现在我们排序结束的各种排序,并且说明一下我们数据结构排序的一个知识点——稳定性。
1.各种排序:
至今为止,我们学习了各种各样的排序方法,类似冒泡排序,希尔排序,快速排序等等,并且也了解到了它们相对应的时间复杂度,并且在某些排序上我们对它们的代码和操作进行了优化使得它们的时间复杂度更上一个档次或者是让它们时间复杂度的最坏情况不会出现,下面我们就对排序列了一个表出来。
这就是我们到现在现实生活中大多数会被使用到的排序方法。(计数排序等并不在生活中广泛运用的未计入)
在表格中我们可以看见除了我们的排序名字,它们的空间复杂度和时间复杂度之外还有一项名为稳定性的数据,它也是我们接下来要拓展讲解的内容和知识。
2.稳定性的概念和应用:
老规矩要了解一个定西就要知道它是什么?那么什么是我们排序的稳定性呢,排序的稳定性在我们的日常生活中又在哪里会被用到呢?
这就是我们排序稳定性的大致的概念,同样的这里我们画一个图来表示排序的稳定性。
在这里我们给一个无序的数组,在这个数组中有一个重复出现的值——5。这里我们将前一个5标注为红色,后一个5标注为蓝色。如果在经过我们上述各种排序方法排序过后可以保证我们的红5依旧在蓝5的前面,怎么我们的这种排序方法就是稳定的,相反这种排序方法就是不稳定的。
而且稳定性在日常生活中我们也经常的使用到,就以我们的高考成绩为例子,如果两个人高考成绩相同的话,接下来我们就要看语文学科的成绩,语文成绩高的名次就在前。
在这里我们就先将语文成绩进行一个排序,语文成绩高的就在前面,语文成绩低的就在后面。然后接下来我们就要用稳定的排序再进行一次排序。因为稳定性的缘故,这里我们的总分相同的位置就不会被交换。
上述就是我们的排序稳定性的运用,那么下来我们就来讲讲哪种排序是稳定的,哪种排序是不稳定的。
3.各种排序的稳定性:
下来我们来分析一下各种排序的稳定性。
1.冒泡排序:
首先就是冒泡排序的稳定性,冒泡排序的稳定性是稳定的,在不是刻意的情况下,我们的冒泡排序是让前一个数和后一个数互换,这里如果两个数相等的话,我们可以不用将这两个数交换,并且也不会影响我们最后排序的结果,因此冒泡排序是稳定的。
2.简单选择排序:
接下来是我们的简单选择排序,简单选择排序在很多人看来是稳定的,但是这里有特殊的情况会导致它变得不稳定。
在这种情况下我们的简单选择排序就会变得不稳定。
3.直接插入排序:
直接插入排序在排序家族中是稳定的,这里也可以十分简单的理解,在数组中比某个数小的话我们就对它的数据进行挪动,如果等于我们的这个数就不进行挪动,这样我们两个重复的数先后顺序也是保存原来的那样。
4.希尔排序:
希尔排序作为我们排序中一个运行很快的排序方法,但是在这里它却是不稳定的,为什么?如果在一个数组中可以保持它们之间的顺序,但是一旦我们分为不同的组进行预排序的时候,这里我们就无法控制它的顺序了,因此它是不稳定的。
5.堆排序:
此处我们堆排序也是不稳定的,比如我们的建大堆的操作。
这里如果最上面的数刚刚好是我们最大的数但是子树中也有和它相同的值的话,交换过后我们的堆排序就会因此而乱套。
6.归并排序:
下来是归并排序,归并排序可以说是我们快速度排序中唯一一个稳定的排序。在我们之前写的代码中它是不稳定的,但是这里我们判断如果排序的值如果第一个归并中的值等于我们第二个归并中的值,我们将第一个值拉下来进行排序即可,因此我们的归并排序是可以做到稳定的。
7.快速排序:
还有一个时间复杂度小的排序,那就是我们的快速排序,在这里不多说快速排序的不稳定的,简单的举一个例子。
这种情况下我们的快速排序就会变得不稳定了,因为要实现头元素和key的交换。
8.计数排序:
剩下的最后一个就是我们的计数排序了,它不适合结构体排序,因此计数排序谈稳定性没有意义。并且我们的计算排序是计算元素的个数最后再一次性的排序一次,可以说是已经混乱的了,我们没办法分辨哪个是先哪个是后。
结尾:
到这里我的数据结构的排序板块就结束了,连带着我们的数据结构板块也落下了帷幕,在将来我们将开始进军C++了,也是时候前往新的未知的领域向前看了,到这里我们的数据结构的博客也就正式的完结了,接下来进入C++后我也会写C++的博客出来,最后希望这篇数据结构博客最后的博客,排序的总结可以给大家带来帮助,最后期待我们在C++中再会。