[数据结构与算法] 学习记录合辑 (08) 排序

  • 该合辑为笔者自b站自学的“C++数据结构与算法”课程学习记录,旨在将重要的学习要点、思考内容与部分代码进行记录,以便后续自行翻看,亦可给其他读者带来一些参考
  • 内容基于笔者自身的理解或感悟,可能存在不妥当或是错误之处
  • 系统环境:Win10,Visual Studio 2019
  • 文中图片参考东北大学“数据结构与算法设计” (2020) 线上课程讲义

目录

1. 排序问题

2. 插入排序类算法

3. 交换排序类算法

4. 选择排序类算法

5. 归并排序类算法

6. 基数排序类算法


排序问题

Sorting Problem

排序问题是非常基础并具有代表性的算法问题,不同算法之间各有千秋,也有各自适应的应用场景,首先介绍一些名词:

 list(表):在内存中存储数据的空间

扫描二维码关注公众号,回复: 16869209 查看本文章

 file(文件):在外部存储器存储数据的空间

 record(记录):对象属性的集合

 field(数据域): 最小的数据单位,如学生的姓名学号等

 key(关键字):用于查找比对的关键字、属性集合

 stable(稳定):用于形容排序算法,即当元素以一定的方式进行排序且无法通过该方式分辨某两个元素的先后位置时(如两个相同的 “1” 之间的排序),以原始序列中两元素的相对位置作为最终结果的相对位置,举个例子:

  • 原始序列:3, 5, 1(首个) ,6 ,1(第二个) ,2
  • 结果序列:1(首个), 1(第二个), 2, 3, 5, 6

如果是不稳定的排序算法,可能会呈现下面的结果:

  • 结果序列*:1(第二个), 1(首个), 2, 3, 5, 6

 internal & external sort(内/外部排序):形容算法利用内存或外存进行排序

 性能指标:用于评价一个排序算法的效率,分为两个维度,第一个是算法比较key的次数,第二个是算法移动数据元素的次数

  • 附:各种常见的排序算法的性能对比


插入排序类算法

Insertion Sorting

普通插入排序算法

逐个插入并保持子序列有序,利用到了哨兵技术

  • 最坏情况: O(n^2) 当原始序列为逆序时
  • 最好情况: O(n) 当原始序列基本有序时

改进:因子序列有序,故在插入某个数值进入子序列时,可以采用折半查找插入,可以将时间复杂度由线性阶优化至对数阶,除此之外,由于数组在插入元素时多会造成大量数据元素的移动,故可以采用链表作为存储介质,可以将插入操作由线性阶优化至常量阶

Shell (希尔排序) 算法

希尔排序的时间复杂度可以达到 O(n^1.25) , 主要思想是将相隔 dk(增量)距离的元素组成子序列,并将其对比和交换(若需要),逐步缩小dk的值,最终使整个序列达到有序,该方法将相隔很远的元素进行对比与交换,花费了较小的代价,为后续交换提供了基础,即后续交换不必再消耗很多的性能开销

gap(dk) 最初等于原始序列长度的一半,每进行一步,gap = gap / 2.2,若无法整除(得零),则gap = 1,进行完gap = 1的排序后,整个序列达到有序


交换排序类算法

Transposition Sorting

冒泡排序

逐个对比并进行交换(若需要),每次将该趟的目标元素(如最大值)推至末尾,若某一趟没有对任何元素进行交换则停止排序并输出,或达到最大趟数也对结果进行输出

较为经典的教学用排序算法,但时间复杂度较高 O(n^2)

快速排序

将原始序列中间元素作为支点元素(Pivot element),其将原始序列分裂成了两个子序列,再通过对比与交换最终实现排序,该排序方法采用了“分治”思想,且号称“最快的”排序算法

最坏情况:支点元素选的太小 O(n^2)

最好情况:支点元素恰好是序列的中间值 O(nlogn)

通过数学算式计算的最终平均复杂度:O(nlogn)

该算法需要用到运行时栈稀罕,花费存储空间 O(logn) ~ O(n) 


选择排序类算法

Selection Sorting

较为好理解,每一趟选出一个目标元素(如max),进行n-1趟,每趟选出的元素顺序排列,没啥可多说的, O(n^2) 


归并排序类算法

Merge Sorting

其代价主要消耗在归并的操作上,该算法类似于快速排序的反向操作,由小推及至大

由相邻2推及至4 → 8 → 16 ...... 时间复杂度达到 O(nlogn) 

需要用到线性大小的存储结构 O(n)


基数排序类算法

Radix Sorting

利用到了数据的位特性,用链表结构实现元素的归类、按位排序、回收等操作,最终实现原始序列的排序输出,下方列举了包含个位及十位的元素的排序过程


The End

猜你喜欢

转载自blog.csdn.net/Norths_/article/details/125775073
今日推荐