数据结构-排序思想

直接插入排序

将后面的无序区中的元素挨个向前面的有序区中插入。

1.将顺序表中R0用作哨兵,按索引i=2...n的次序,将Ri向有序区R1...i-1中执行插入操作。

2.插入操作可采取在有序区中从后向前的查找比较和移动的方法。

3.此操作中比较的次数与原序列的排列状态有关:

原序列为正序时在插入操作中插入位置为尾部即只需要比较一次;

原序列为反序时插入位置为头部则需要和有序序列中的每个元素比较一次。

时间复杂度:正序时O(n),反序时 O(n²),平均时间复杂度 O(n²)

空间复杂度:O(1),就地排序

直接插入排序是稳定的。

希尔排序(分组插入排序)

1.把序列分为d个组,分组方法为所有距离为d的元素划到一个组内。

2.各组内进行直接插入排序。

3.按照避免增量序列中的值互为倍数,及最后一个增量必须为1的原则,设定增量序列d。

希尔排序是不稳定的。

冒泡(交换)排序

1.从下面无序区的最底部元素开始向上两两比较,最小者交换到无序区的最顶部,它同时也处了在有序区的最底部。

2.当某一趟扫描中的两两比较未出现交换,则说明无序区已全部有序,排序结束。

时间复杂度:正序时O(n),反序时 O(n²),平均时间复杂度 O(n²)

空间复杂度:属于就地排序

冒泡排序是稳定的。性能低于直接插入排序。

快速(交换)排序(基准分冶)

1.确定基准

在区间R中可随机选择一个元素作为基准,和R0交换位置。

2.对比划分

以R0作为基准做一趟划分操作:从区间两端开始向中间依次交替与基准比较大,根据小在左侧、大在右侧的规则与基准交换位置,最终生成比基准值小和大的左右两个无序的子区间。

3.递归

对每个子区间递归定基准-划分过程。

划分操作结果中有一个子区间为空,及两个子区间都不为空,这两种情况比较,前者整体排序中做的比较次数更多。

时间复杂度:最好 O(nlgn),最坏 O(n²),平均 O(nlgn)

空间复杂度:O(lgn)

快速排序是不稳定的。

直接选择排序

1.从后面的无序区中选择最小的元素,与无序区头部元素交换,即有序区末尾增加一个元素。

2.对新的有序区和无序区执行上一步操作。

时间复杂度:O(n²)

空间复杂度:O(1),就地排序

直接选择排序是不稳定的。

插入排序是先在指定位置取元素,然后再找合适的位置插入,重心在第二步的插入。

选择排序是先找最小的元素,然后交换到指定位置,重心在第一步的选择。

堆排序(树形选择排序)

调整堆(筛选):判断调整根子树,将根与两个孩子中较大者(大根堆)交换,继而判断调整有变动的子子树。

1.构造堆

从下往上依次对位置为n/2...1为根的子树做调整堆操作。

结果构造出了堆,此时只是符合堆性质,但并不有序。

2.将堆根元素交换到无序区尾部。

i为本次调整的序号,将堆顶元素R1和最后一个元素Rn-i+1交换,则新的无序区变为R1...n-i,有序区为Rn-i+1,n

3.重建堆

对新的无序区判断调整堆。

4.重复2、3步骤共n-1次。

时间复杂度:O(nlgn)

空间复杂度:O(1),就地排序

堆排序是不稳定的。

归并排序(二路归并排序)

1.将区间内的元素两两做二路归并。

2.将上一步形成的各个有序组两两做二路归并。

3.直至全部元素进入同一个有序组。

4.二路归并需要同等的辅助空间。

时间复杂度:O(nlgn)

空间复杂度:O(n),

归并排序是稳定的。

以上基于关键字比较的排序时间下限是O(nlgn),而分配排序无须比较关键字,通过分配和收集过来实现排序,它们的时间复杂度可以下破到线性阶O(n)。

箱排序(桶排序)

分配排序不基于关键字比较,而是通过分配和收集过程实现排序。时间复杂度可达线性阶。

第一种箱排序是设置箱子个数和关键字的种类的个数相同;

第二种桶排序是关键字映射到某个桶中,桶中的所有元素再单独做关键字比较排序

基数排序

基数排序要求分析关键字的结构,分为多关键字和单关键字,每个关键字又由多个位组成。

单关键字的每位即每个分量可能取值个数称为基数,

基数排序是按基数的个数次数从低位到高位对序列元素进行箱排序,每箱排序的结果作为下一趟排序的输入。

基数排序是稳定的。

相关推荐
Mem0rin9 分钟前
二分查找:左右边界
数据结构·算法
lazily-c30 分钟前
数据结构模板
数据结构
祖力559 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省10 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79811 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25812 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记12 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI12 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型13 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光13 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口