数据结构自学Day11-- 排序算法

一、排序算法的概念

        排序(Sorting)是指:将一组“无序”的数据,按照某种“顺序规则”排列成“有序”的过程。

1、按排序顺序分类:

        升序:从小到大排列,如 1, 3, 5, 7, 9

  • 降序:从大到小排列,如 9, 7, 5, 3, 1

2、按排序方式分类:

分类方式

排序类型

简要说明

内部排序

冒泡、插入、选择、归并、快速等

所有数据在内存中进行排序

外部排序

多路归并排序

数据量过大时,需借助外部存储

二、 常见的排序算法及其特点

排序算法

时间复杂度(平均)

空间复杂度

是否稳定

适用场景

冒泡排序

O(n²)

O(1)

稳定

小规模数据、教学演示

选择排序

O(n²)

O(1)

不稳定

数据量小、对稳定性要求不高

插入排序

O(n²)

O(1)

稳定

基本有序数据、链表排序

归并排序

O(n log n)

O(n)

稳定

大数据排序、需要稳定性

快速排序

O(n log n)

O(log n)

不稳定

实际中最常用,效率高

堆排序

O(n log n)

O(1)

不稳定

不要求稳定性的高效排序

计数排序

O(n + k)

O(k)

稳定

数据范围小的整数排序

桶排序

O(n + k)

O(n + k)

稳定

分布均匀的数据

基数排序

O(nk)

O(n + k)

稳定

位数较小的整数/字符串

三、排序算法的应用场景

  1. 数据库系统

    • 排序是实现 ORDER BY 的核心

    • 排序有助于数据压缩和索引创建

  2. 搜索优化

    • 排序之后可以使用二分查找,大幅提高搜索效率

    数据分析和可视化

    • 排序能帮助找出最大/最小值、前 K 大数等

    • 排序数据更容易图表化展示

  3. 去重和统计

              排序后相同数据聚集在一起,方便统计频率或去重

  4. 工程开发

              排序是实现自动推荐、页面排名、调度优化等系统的基础

四、常用排序算法的实现

        1、冒泡排序🫧

        不断比较邻近的元素,将大元素右移,最终排成升序序列

代码实现:

void Swap(int* p,int* q){assert(p&&q);int tmp = *p;*p = *q;*q = tmp;return;
}void Bubble_sort(int* arr,int size){assert(arr);int end = size-1;int flag = 0;for (int i = 0;i<end;i++){for(int j = 0;j<end-i;j++){if(arr[j]>arr[j+1]){Swap(&arr[j],&arr[j+1]);flag = 1;}}if(flag == 0){break;}}return;
}//测试函数
int main(){int arr[]= {6,2,8,10,1,3,5,12,4};Bubble_sort(arr,9);for(int i = 0;i<9;i++){printf("%d ",arr[i]);}
}

冒泡排序的时间复杂度为O(N^2),空间复杂度O(1)

2、插入排序

        将数组的每个元素与所在位置之前的元素比较,找到升序(降序)位插入即可。

代码实现:

void Insert_Sort(int* arr,int size){assert(arr);for (int end = 1;end<size;end++){for(int j = end-1;j>=0;j--){if(arr[j+1]<arr[j]){Swap(&arr[j],&arr[j+1]);}else{break;}}}
}int main(){int arr[]= {6,2,8,10,1,3,5,12,4};// Bubble_sort(arr,9);Insert_Sort(arr,9);for(int i = 0;i<9;i++){printf("%d ",arr[i]);}
}

插入排序的时间复杂度为O(N^2),空间复杂度O(1)

3、希尔排序的基本思想

希尔排序的提出者是 Donald Shell(1959 年),它是第一个突破 O(n²) 时间复杂度的排序算法。

核心思想:
将原始数组按照某个间隔 gap 进行“分组”,每组分别进行插入排序,然后逐步减小 gap,最终 gap = 1 时再进行一次插入排序,完成排序。
希尔排序的步骤说明(以升序为例)
  1. 选择一个初始间隔 gap,通常是数组长度的一半,如 gap = n/2

  2. 将数组划分为 gap 个子序列(组内元素间隔为 gap

  3. 对每个子序列进行插入排序

  4. 缩小 gap:gap = gap / 2

  5. 重复步骤 2~4,直到 gap = 1

思维导图

代码实现:

void Shell_Sort(int* arr,int size){assert(arr);int gap = size;while(gap > 1){gap = gap/3+1;for (int end = gap;end<size;end++){int j = end-gap;int tmp = arr[end];while (j>=0 && arr[j]>tmp){arr[j+gap] = arr[j];j -= gap;}arr[j+gap] = tmp;}  }
}

希尔排序的时间复杂度:最坏情况视 gap 序列而定,常见为 O(n^(1.3 ~ 2)),比 O(n²) 快很多

希尔排序的特点

特性

描述

时间复杂度

最坏情况视 gap 序列而定,常见为 O(n^(1.3 ~ 2)),比 O(n²) 快很多

空间复杂度

O(1)(原地排序)

稳定性

不稳定排序(可能打乱相同元素顺序)

应用场景

中等规模、内存受限的排序任务

希尔排序与插入排序的对比

项目

插入排序

希尔排序

排序速度

慢(O(n²))

快(改进版插排)

数据交换次数

排序思想

比较相邻元素

比较“间隔 gap”的元素

应对无序数据

效率低

效率更高

好了本期的排序算法内容分享就到这里结束了,谢谢大家的点赞收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92201.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理1. 定义三极管&#xff08;Transistor&#xff09;是一种具有三层半导体材料&#xff08;P-N-P 或 N-P-N&#xff09;构成的半导体器件&#xff0c;用于信号放大、开关控制和信号调制等应用。三极管有三个引脚&#xff1a;发射极&#xff08;Emitter&…

数据结构之克鲁斯卡尔算法

前言&#xff1a;和Prim算法一样&#xff0c;Kruskal 算法也是用来生成最小生成树的&#xff0c;这篇文章来学习一下Kruskal算法的实现 一、实现流程 初始化的时候&#xff0c;将所有的边用一个数组存储&#xff0c;并且按权值从小到大进行排序&#xff0c;每次选一个权值最小的…

MongoDB 查询时区问题

MongoDB默认时区是UTC&#xff0c;比北京时区晚八小时&#xff0c;北京时间UTC8h。 // 北京时间的 2024-10-01 08:00:00 // (>) 大于 - $gt // (<) 小于 - $lt // (>) 大于等于 - $gte // (< ) 小于等于 - $lte// Z代表UTC时区1、{"gmtCreate":{"$…

Windows VS2019 编译 Apache Thrift 0.15.0

随着微服务架构的普及,高效的跨语言远程过程调用(RPC) 成为了构建分布式系统的重要基础。Apache Thrift 是 Facebook 开源的一个轻量级、高性能的 RPC 框架,它允许开发者通过一个通用的接口定义语言(IDL)来定义服务接口和数据结构,并自动生成多种语言的客户端和服务端代…

搭建种草商城框架指南

一、引言在当今电商市场&#xff0c;种草商城以其独特的社交化购物模式受到越来越多用户的喜爱。搭建一个功能完善、体验良好的种草商城框架&#xff0c;需要综合考虑前端界面、后端服务、数据库设计等多个方面。本文将为你详细介绍搭建种草商城框架的关键要点和技术选型。二、…

docker--挂载

设置容器的挂载 需要注意 挂载行为会覆盖容器目标目录的原有内容(未验证)。 查看容器的挂载情况 在容器外部查看: docker inspect <容器名或容器ID> | grep -A n "Mounts" -A n 的含义 -A 是 --after-context 的缩写,表示显示匹配行及其后 n 行。 "Mo…

以Streamable HTTP方式访问mcp server的过程

一、mcp server 部署 使用fastmcp框架 部署 mcp server&#xff0c; 以下是源代码 # 引入 fastmcp 依赖包 from fastmcp import FastMCP# 新建fastmcp实例&#xff0c; 名字叫做 weather mcp FastMCP("weather")mcp.tool(name"weather", tags{"weath…

二次元 IP 虚拟数字人宣传:漫画角色动态直播与衍生周边预售联动

当漫画角色从静态画稿中走出&#xff0c;以动态直播的形式与粉丝实时互动&#xff0c;再顺势开启衍生周边预售 —— 虚拟数字人技术正重塑二次元 IP 的宣传逻辑。这种 “动态直播 周边预售” 的联动模式&#xff0c;不仅打破了次元壁&#xff0c;更让 IP 热度高效转化为商业价…

如何在服务器上获取Linux目录大小

目前我在管理一台hostease的服务器时遇到服务器磁盘空间不足的情况。随着在系统中添加更多文件&#xff0c;这些系统文件目录也变得越来越大。过大的目录也消耗了系统资源&#xff0c;导致系统运行缓慢。后来我通过下列的方法对服务器上的磁盘空间使用进行了逐一检查。在这篇综…

来伊份养馋记社区零售 4.0 上海首店落沪:重构 “家门口” 的生活服务生态

7 月 19 日&#xff0c;来伊份与养馋记战略合作的首个 “社区零售 4.0” 门店在上海松江泗泾镇泗宝路正式开业。这不仅是双方自今年 1 月达成战略合作后的实质性落地&#xff0c;更是 3 月 “社区生活新生态” 构想的首次规模化实践&#xff0c;标志着零食行业巨头与社区零售新…

从C++开始的编程生活(3)——引用类型、内联inline和nullptr

前言 本系列文章承接C语言的学习&#xff0c;需要有C语言的基础才能学会哦~ 第3篇主要讲的是有关于C的引用类型、内联inline和nullptr。 C才起步&#xff0c;都很简单呢&#xff01; 目录 前言 引用类型 基本语法 特性 应用 const引用 基本语法 引用与指针的关系 内联…

makefile-- 其他函数

fuctionsjoin​$(join <list1>,<list2>)连接函数把list2 中单词对应的添加到list1 的后面若list1 的单词个数> list2 &#xff0c;多出的list1 保持不变若list2 的单词个数> list21&#xff0c;多出的list2 添加到list1 后面foreach​$(foreach <var>…

【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形

文章目录 前言 实战 1、实现要点 1.1 NavMesh.CalculatePath方法计算两个点之间的导航路径 1.2 寻找投射的地面点 2、代码实现如下 3、烘培地面导航网格 4、添加导航玩家代理,并挂载前面的脚本 5、创建Line Renderer,并放在角色下面作为子物体 6、运行游戏查看效果 专栏推荐 …

宝塔申请证书错误,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘

遇到"module OpenSSL.crypto has no attribute sign"错误时&#xff0c;通常是由于pyOpenSSL版本兼容性问题导致的‌。以下是解决方案&#xff1a;通过SSH连接到服务器&#xff0c;执行以下命令安装指定版本的pyOpenSSL&#xff1a;btpip install pyOpenSSL24.2.1-U然…

【ffmpeg源码学习】详解pkg-config的作用

文章目录 前言 一、什么是pkg-config? 二、为什么需要 pkg-config? 三、pkg-config 的工作原理 3.1 .pc 文件 3.2 查询流程 3.3 查找路径 四、pkg-config 在 FFmpeg 中的作用 五、pkg-config 的常用命令 六、在项目中的实际用法 6.1 makefile示例: 6.2 cmake示例: 6.3 gcc命…

PHPStorm携手ThinkPHP8:开启高效开发之旅

目录一、前期准备1.1 开发环境搭建1.2 配置 Xdebug二、PHPStorm 集成 ThinkPHP82.1 导入 ThinkPHP8 项目2.2 配置 PHP 解释器2.3 配置服务器三、ThinkPHP8 项目开发基础3.1 项目结构剖析3.2 控制器与方法创建3.3 视图渲染与数据传递四、数据库操作与模型定义4.1 数据库配置4.2 …

HTTP性能优化实战技术详解(2025)

HTTP性能优化实战技术详解本文基于提供的文章大纲&#xff0c;对HTTP性能优化进行扩展说明。文章结构清晰&#xff0c;从理解瓶颈到具体优化策略&#xff0c;再到监控与高级技巧&#xff0c;逐步展开。每个部分包括背景介绍、核心原理、实施步骤、示例或工具推荐&#xff0c;确…

探索文件系统:软硬链接的奥秘

目录 1.文件系统 1.1 磁盘物理存储结构 1.2 磁盘逻辑存储结构 1.3 inode编号 2. 软硬链接 2.1 软链接 2.2 硬链接 2.3 目录文件的软硬链接 1.文件系统 在一台电脑中&#xff0c;大部分文件都不是被打开的&#xff0c;这些文件都在磁盘中进行保存。已经打开的文件需要管…

3x3矩阵教程

3x3矩阵教程 1. 简介 三维矩阵是线性代数中的重要概念&#xff0c;用于表示三维空间中的线性变换。本教程将介绍如何使用C实现三维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度学习前置知识

文章目录介绍数据操作张量张量的定义1. **张量的维度&#xff08;Rank&#xff09;**2. **张量的形状&#xff08;Shape&#xff09;**简单的数据预处理&#xff08;插值线性代数微积分概率论1. 基本概念(1) 随机试验与事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…