【数据结构与算法】七大排序算法(下)

【数据结构与算法】七大排序算法(下)

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

🌼文章目录🌼

[2.3 交换排序](#2.3 交换排序)

[2.3.1 冒泡排序](#2.3.1 冒泡排序)

[2.3.2 快速排序](#2.3.2 快速排序)

[2.3.3 快速排序(非递归)](#2.3.3 快速排序(非递归))

[2.4 归并排序](#2.4 归并排序)

[3. 排序算法复杂度及稳定性分析](#3. 排序算法复杂度及稳定性分析)

2.3 交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

2.3.1 冒泡排序

冒泡排序的特性总结:

① 冒泡排序是一种非常容易理解的排序

② 时间复杂度:O(N^2)

③ 空间复杂度:O(1)

④ 稳定性:稳定

2.3.2 快速排序

快速排序是Hoare 于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

① Hoare版本

② 挖坑法

③ 双指针法

快速排序优化:

① 三数取中法选key

② 小区间优化法:递归到小区间时,选择另外的排序对数组进行排序,可以考虑使用插入排序

2.3.3 快速排序(非递归)

//快速排序(非递归)

//思路:使用栈存储每个递归的区间。
void QuickSortNoRe(int* arr,int left,int right)
{
ST st;
StackInit(&st);
StackPush(&st, right);
StackPush(&st, left);
while(!StackEmpty(&st))
{
int key = StackTop(&st);
int begin = StackTop(&st);//取得当前区间左界限(栈顶元素)
int begin1 = StackTop(&st);
StackPop(&st);//推出栈顶元素
int end = StackTop(&st);//取得当前区间右界限
int end2 = StackTop(&st);
StackPop(&st);
while (begin < end)//当前区间进行单趟快速排序
{
while (begin < end && arr[end] >= arr[key])
{
end--;
}
while (begin < end && arr[begin] <= arr[key])
{
begin++;
}
Swap(&arr[begin], &arr[end]);
}
Swap(&arr[begin], &arr[key]);
key = begin;
int end1 = key - 1;//划分左子区间
int begin2 = key + 1;//划分右子区间
if (begin2 < end2)//判断右子区间长度是否>1。>1则继续将区间入栈;否则,不入栈。
{
StackPush(&st, end2);
StackPush(&st, begin2);
}
if (begin1 < end1)//判断左子区间长度是否>1。>1则继续将区间入栈;否则,不入栈
{
StackPush(&st, end1);
StackPush(&st, begin1);
}
}
}

快速排序的特性总结:

① 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序。

② 时间复杂度:O(N*logN)。

③ 空间复杂度:O(logN)。

④ 稳定性:不稳定。

2.4 归并排序

基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序核心步骤:

归并排序特性总结:

① 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

② 时间复杂度:O(N*logN)。

③****空间复杂度:O(N)。

④ 稳定性:稳定

3. 排序算法复杂度及稳定性分析
相关推荐
一切皆是因缘际会5 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
Java成神之路-5 小时前
【LeetCode 刷题笔记】34. 在排序数组中查找元素的第一个和最后一个位置 | 二分查找经典刷题题解
算法·leetcode
不忘不弃5 小时前
用BFS方法求解平分汽油问题
算法·宽度优先
AI科技星5 小时前
全域数学·72分册·射影原本 无穷维射影几何卷细化子目录【乖乖数学】
人工智能·线性代数·算法·机器学习·数学建模·数据挖掘·量子计算
风落无尘6 小时前
《智能重生:从垃圾堆到AI工程师》——第四章 变化的艺术
人工智能·线性代数·算法
JAVA面经实录9176 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦6 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
WBluuue6 小时前
Codeforces 1093 Div2(ABCD1D2)
c++·算法
浅念-6 小时前
「一文吃透 BFS:从层序遍历到锯齿形、最大宽度、每层最大值」
数据结构·算法
汉克老师6 小时前
GESP5级C++考试语法知识(十三、贪心算法(一))
算法·贪心算法·海盗船·gesp5级·gesp五级·排队接水