基础算法_排序算法总结

news/2024/7/9 19:08:20 标签: 算法, 排序算法, 数据结构

基础算法_排序算法总结

  • 排序算法
    • 稳定性概念
    • 种类
      • 1 选择排序
        • 原理
        • 性能
      • 2 冒泡排序
        • 原理
        • 性能
      • 3 插入排序
        • 原理
        • 性能
      • 4 计数排序
        • 原理
        • 性能
        • 适用场景
      • 5 基数排序
        • 原理
        • 性能
      • 6 快速排序
        • 原理
        • 性能
        • 内省排序
      • 7 归并排序
        • 原理
        • 性能
      • 8 堆排序
        • 原理
        • 性能
      • 9 桶排序
        • 原理
        • 性能
        • 适用场景
      • 10 希尔排序
        • 原理
        • 性能

排序算法

稳定性概念

排序前后大小相同元素的序列顺序是否改变,不发生改变则为稳定。

种类

1 选择排序

原理

每次找出第 i 小的元素,将该元素与第 i 位元素交换。

性能

稳定性:不稳定。交换元素时会打破稳定性。
时间复杂度: O(n²)。
空间复杂度:O(1)。

原地算法概念:不需要增加数量级的额外空间复杂度的算法。选择排序为原地算法

2 冒泡排序

原理

每次检查相邻的元素,并根据条件判断是否交换。

性能

稳定性:稳定。
时间复杂度:最优时间复杂度为O(n),最坏时间复杂度为O(n²),平均时间复杂度为O(n²)。
空间复杂度:O(1)。

3 插入排序

原理

将元素分为已排序未排序两部分。每次从未排序的元素中选出一个插入已排序序列。
通常已排序部分为第 0 ~ i-1 位,插入元素为第 i 位。

性能

稳定性:稳定。
时间复杂度:最优时间复杂度为O(n),最坏时间复杂度为O(n²),平均时间复杂度为O(n²)。
空间复杂度:O(1)。

4 计数排序

原理

根据元素取值范围设置一个额外数组 numCount ,元素值上下界的差为数组的宽度。计算取值范围内每个值出现的次数,再计算 numCount 的前缀和。利用前缀和从又至左确定元素排名。
例如元素取值范围为1~100,则定义 vector< int> numCount(100); ,其中若17出现4次,则numCount[16] = 4; 。

性能

稳定性:稳定。
时间复杂度:O(n + w),其中w为取值范围。
空间复杂度:O(n + w)。

适用场景

数据取值范围较小的时候。

5 基数排序

原理

将待排序元素分为k个关键字,按顺序对每一个关键字进行排序。关键字内排序可以使用计数排序。
例如对长度为 m 的 string 类型按字典序进行排序,从第 m-1 位到第 0 位依次进行排序。
对于整型数据可以从个位到最高位进行排序,不足位数添加前导零即可。

性能

稳定性:稳定。
时间复杂度:关键字内部使用计数排序时,时间复杂度为O(nm + ∑wi),其中m为关键字个数,w为取值范围。关键字内部使用O(nlogn)排序方法时,时间复杂度为O(mnlogn)。
空间复杂度:O(n + k)。

6 快速排序

原理

快速排序运用了递归的思想。随机选取一个数,把比它大的数和比它小的数分到两边,再用同样的方式处理两边的数组。

性能

稳定性:不稳定。
时间复杂度:最优时间复杂度和平均时间复杂度为O(nlogn) ,最坏时间复杂度为 O(n²)。
空间复杂度:O(logn) ~ O(n)。

内省排序

内省排序是快排和堆排的结合,是对快排的一种优化。内省将快排的最大递归深度限制在O(logn),超过该深度时改用堆排。algorithm 库中 sort 函数使用的是内省排序。

7 归并排序

原理

采用分治思想,二分数组递归排序。

性能

稳定性:稳定。
时间复杂度:O(nlogn) 。
空间复杂度:O(n)。

8 堆排序

原理

利用二叉树的性质,第 i 位的元素,第 i2+1 位和第 i2+2 位为其儿子元素。先建立大根堆或小根堆,再从最后一个叶子结点往前进行处理。

性能

稳定性:不稳定。
时间复杂度:O(nlogn) 。
空间复杂度:O(1)。

9 桶排序

原理

桶排序和计数排序类似,按取值范围均分为m段,把元素放到每一段(桶)里,再对每一段(每个桶)进行排序。

性能

稳定性:桶内部使用插入排序时稳定。
时间复杂度:桶内部使用插入排序时,平均时间复杂度时间复杂度为O(n + n²/m + m) ,最坏时间复杂度为O(n²)。
空间复杂度:O(n)。

适用场景

数据分布均匀的时候。

10 希尔排序

原理

希尔排序是对插入排序的优化。把数组中的元素看作是一个矩阵,分成m列,逐列进行插入排序排序,m从某个整数逐渐减为1。

性能

稳定性:不稳定。
时间复杂度:平均时间复杂度和最坏时间复杂度和m减小的方式有关系,例如 m=m/3,则时间复杂度为O(n^(3/2))。
空间复杂度:O(1)。


http://www.niftyadmin.cn/n/1367485.html

相关文章

设计模式_11 桥接模式(含 UML图 和 C++代码)

设计模式_10 桥接模式11 桥接模式11.1 概念11.2 结构11.3 实现11.3.1 UML图11.3.2 代码11.4 优点11.5 使用场景return 设计模式概述;11 桥接模式 11.1 概念 将抽象与实现分离&#xff0c;使他们可以独立变化。用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这…

设计模式_12 外观模式(含 UML图 和 C++代码)

设计模式_12 外观模式12 外观模式12.1 概念12.2 结构12.3 实现12.3.1 UML图12.3.2 代码12.4 优缺点12.4.1 优点12.4.2 缺点12.5 使用场景retur 设计模式概述;12 外观模式 12.1 概念 通过为多个复杂子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。…

设计模式_13 组合模式(含 UML图 和 C++代码)

设计模式_13 组合模式13 组合模式13.1 概念13.2 结构13.3 实现13.3.1 UML图13.3.2 代码13.3.3 测试结果13.4 分类13.4.1 透明组合模式13.4.2 安全组合模式13.5 优点13.6 使用场景retur 设计模式概述;13 组合模式 13.1 概念 用于把一组相似的对象当做一个单一的对象。组合模式…

设计模式_14 享元模式(含 UML图 和 C++代码)

设计模式_14 享元模式14 组合模式14.1 概念14.2 结构14.2.1 状态14.2.2 角色14.3 实现14.3.1 UML图14.3.2 代码14.4 优缺点14.4.1 优点14.4.2 缺点14.5 使用场景retur 设计模式概述;14 组合模式 14.1 概念 利用共享技术来有效支持大量细粒度对象的复用。通过共享已经存在的对…

设计模式_15 模板方法模式(含 UML图 和 C++代码)

设计模式_15 模板方法模式15 模板方法模式15.1 概念15.2 结构15.3 实现15.3.1 UML图15.3.2 代码15.4 优缺点15.4.1 优点15.4.2 缺点15.5 使用场景return 设计模式概述;15 模板方法模式 15.1 概念 定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中&#x…

设计模式_16 策略模式(含 UML图 和 C++代码)

设计模式_16 策略模式16 策略模式16.1 概念16.2 结构16.3 实现16.3.1 UML图16.3.2 代码16.4 优缺点16.4.1 优点16.4.2 缺点16.5 使用场景return 设计模式概述;16 策略模式 16.1 概念 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使他们可以相互替换&…

设计模式_17 命令模式(含 UML图 和 C++代码)

设计模式_17 命令模式17 命令模式17.1 概念17.2 结构17.3 实现17.3.1 UML图17.3.2 代码17.4 优缺点17.4.1 优点17.4.2 缺点17.5 使用场景return 设计模式概述;17 命令模式 17.1 概念 将一个请求封装为一个对象&#xff0c;使发出请求的责任与执行请求的责任分割开。这样两者之…

设计模式_18 责任链模式(含 UML图 和 C++代码)

设计模式_18 责任链模式18 责任链模式18.1 概念18.2 结构18.3 实现18.3.1 UML图18.3.2 代码18.4 优缺点18.4.1 优点18.4.2 缺点return 设计模式概述;18 责任链模式 18.1 概念 为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对象记住其…