数据结构:第8章学习小结

一.排序相关概念:
稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序仍然不变,则称这排序算法是稳定的,否则称为不稳定的。

内部排序: 数据元素全部放在内存中的排序。

外部排序: 不断在内外存之间移动数据的排序。

二.常见排序

 1.直接插入排序

基本原理:每次都将排序中的元素,插入到前面已经排好序的有序序列中去,直到排序完成。这与斗地主习惯性整理排面的原理是一样的。

时间复杂度为O(n^2)。

在插入到已排序的数据时采用折半查找(二分查找),取已经排好序的数组的中间元素,与插入的数据进行比较,如果比插入的数据大,那么插入的数据肯定属于前半部分,否则属于后半部分,依次不断缩小范围,确定要插入的位置。这种对直接插入排序的改进算法就是折半插入排序。虽然时间复杂度仍然是O(n^2),但折半插入的查找比直接插入的查找次数要少,总体上优于直接插入排序。
两种排序的优点都是能实现稳定排序,但不适合n过大的情况。另外,由于折半插入排序依赖于折半查找,因此只能使用顺序存储结构。

2.简单选择排序

基本原理:每一趟从待排序的数据元素中选出最小(最大)的元素,顺序放在待排序的数列最前,直到全部待排序的数据元素全部排完。

时间复杂度为O(n^2)

简单选择排序的结果是不稳定的,原因在于算法采用的“交换记录”的策略,通过改变这种策略,是可以写出稳定的选择排序算法的。

3.堆排序

堆排序的总结这篇博客写的挺好理解的(感觉自己学不到家就不乱写了)。

参考文献:https://www.cnblogs.com/chengxiao/p/6129630.html

4.冒泡排序

基本原理:每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了。

时间复杂度:O(n^2)

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。如果两个元素相等相邻,代码中是不需要让它们交换的,因此冒泡排序是一种稳定排序算法。
 
5.快速排序
基本原理:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序是基于二分的思想,对冒泡排序的一种改进,

时间复杂度:快速排序在最坏的情况下,仍可能是相邻的两个数进行交换,因此快速排序最坏情况下将退化为O(n^2),平均时间复杂度为O(nlog2n)

快排的优点在于数据移动少,当n较大时,在平均情况下是所有内部排序算法中最快的,但缺点是不稳定,且较难应用于链式结构。

6.归并排序

基本原理:这篇文章就讲的特别好,强烈建议大家看看!https://www.ituring.com.cn/book/miniarticle/62897

时间复杂度:O(nlog2n)

归并排序多用于需要外部排序的场景。除此之外当n较大时并且需要保证稳定性的内部排序也可以采用归并排序(不要求稳定性的内部排序一般采用快排)。

 

 

posted on 2020-07-12 16:38  曾繁浩  阅读(160)  评论(0编辑  收藏  举报