详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)
文章目录
- 前言
- 1.插入排序(InsertSort)
- 1.1 核心思路
- 1.2 实现代码
- 2.选择排序(SelectSort)
- 2.1 核心思路
- 2.2 实现代码
- 3.冒泡排序(BubbleSort)
- 3.1 核心思路
- 3.2 实现代码
- 4.希尔排序(ShellSort)
- 4.1 核心思路
- 4.2 实现代码
前言
在日常生活中,我们常常要将各种各样的数据进行排序,例如我要将班上的学生按照数学成绩从大到小的排序,像这种一般情况,编译器自带的sort函数就能满足我们的要求。但是,假如我要将班上姓刘的学生按照数学成绩从大到小的排序呢?
这种时候,编译器自带的sort函数无法满足需求,我们就需要自己定义一个排序函数。 下面我就要介绍目前的八大排序的原理,代码,以及时间,空间复杂度。
1.插入排序(InsertSort)
1.1 核心思路
直接插入排序的核心思路是先分组,再比较。
例如上面的数组,有六个数。那么我们就可以先把[3,6]分成一组进行比较,得到[3,6]数组。 再把[3,6,7]分成一组进行比较,得到[3,6,7]数组。再把[3,6,7,1]分成一组,得到[1,3,6, 7]数组。 以此类推,得到[1,2,3,4,6,7]数组。
1.2 实现代码
// 插入排序
//插入排序的核心思路就是把i个数分成一组,让第i个数与第i+1个数进行比较
//把较大的数放在后面
void InsertSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;//把i个数分成一组int tmp = arr[end + 1];//记录最后一个数while (end >= 0){//把i + 2个数分成一组,当 end >= 0 时//说明这一组的数没有全部比较,循环比较大小if (arr[end] > tmp){//位于end的数大于最后一个数arr[end + 1] = arr[end];//把位于end的数赋值给end + 1的位置end--;//end--,比较下一个数}else {break;}}arr[end + 1] = tmp;//退出while循环有两种情况//1.end减少到-1,说明这一组的数均大于最后一个数//这样end+1 == 0,把最后一个数赋值给0的位置//2.break提前跳出循环,说明此时end的数小于最后一个数//那么把最后一个数放在end + 1的位置}
}
2.选择排序(SelectSort)
2.1 核心思路
选择排序的核心思路是先找到当前数组中的最大和最小数,再放到相应的位置。
例如上面的数组,选择排序中我们会定义好第一个位置(0)和最后一个位置(size - 1),再从数组中找到最小(1)和最大数(7),再把1和7放到相应的位置上。 再定义好第二个位置(1)和倒数第二个位置(size - 2),再从数组中找到第二小(2)和 第二大的数(6),再把2和6放到相应的位置上。 以此类推,直到所有的数排序完。
2.2 实现代码
// 选择排序
void SelectSort(int* arr, int n)
{int begin = 0;int end = n - 1;//定义最小数据和最大数据的位置while (begin < end)//当begin小于end时,说明数组中的数据没有比较完,循环比较{int mini = begin, maxi = begin;//先定义一个最小数和最大数for (int i = begin + 1; i <= end; i++)//找大找小,从第二个数开始比较{if (arr[i] > arr[maxi])//当前数组轮到的数大于当前的最大数,那么这个数就是新的最大数{maxi = i;}if (arr[i] < arr[mini])//当前数组轮到的数小于当前的最小数,那么这个数就是新的最小数{mini = i;}}if (maxi == begin)//防止数组中全是相同的数,导致maxi没有改变{maxi = mini;}Swap(&arr[mini], &arr[begin]);//让最小的数与第一个数进行交换Swap(&arr[maxi], &arr[end]);//让最大的数与第二个数进行交换++begin;//已经找到最小的数,需要找第二小的数,所以begin++--end;//已经找到最大的数,需要找第二大的数,所以end--}
}
3.冒泡排序(BubbleSort)
3.1 核心思路
冒泡排序的核心思路是暴力比较,所有的数都比较一遍。
例如上面的数组,将3与剩下所有的数字比较,3大于1,则把3放在1的位置,1放在3的位置。 所有的数比较完成后就能得到有序的数组。
3.2 实现代码
void BubbleSort(int* arr, int n)
{for (int i = 0; i < n; i++)//找好第一个数{for (int j = i + 1; j < n; j++)//从第二个数开始{if (arr[i] > arr[j])//所有的数与第一个数进行比较{Swap(&arr[i], &arr[j]);//如果第一个数大于比较的数,则交换这两个数}}}
}
4.希尔排序(ShellSort)
4.1 核心思路
希尔排序的核心思路是将数组分成若干个小组,小组先进行预排序,小组预排序完成后,再将 所有的组合并并且进行排序。
例如上面的数组,将数组分成三分之一,则得到[3,6][7,1][4,2]三个数组。先对这三个数组进行排序,得到[3,6][1,7][2,4]三个数组。 然后将这三个数组合并成两个数组,得到[3,6,1][7,2,4]两个数组。再对[3,6,1][7,2,4]进行排序。得到[1,3,6][2,4,7]两个数组。 再将这两个数组合并,得到[1,3,6,2,4,7],排序得到[1,2,3,4,6,7]。
4.2 实现代码
// 希尔排序
void ShellSort(int* arr, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;//将数组分成三分之一。+ 1 是为了防止gap < 3从而导致gap / 3 == 0//同时for循环结束时,再将数组进行细分for (int i = 0; i < n - gap; i++)//由于数组被分成三分之一个,所以数组的大小也变为三分之一{int end = i;//第一个小组的第一个成员,i++之后就是第二个小组的第一个成员int tmp = arr[end + gap];//第一个小组的最后一个成员,i++之后就是第二个小组的最后一个成员while (end >= 0)//{if (arr[end] > tmp)//当第一个小组里的第一个成员大于最后一个成员时{arr[end + gap] = arr[end];//把第一个成员放到最后一个成员的位置end -= gap;//由于开始比较的是所有组的第一个成员//当end > gap时,说明要开始比较组里的第二个成员了//第二个成员比较完,再比较第三个成员}else {break;}}arr[end + gap] = tmp;//有两种情况//1.end减少到 < 0,说明这一组的数成倒序//则需要把组里所有的数比较并交换完之后结束循环//2.break提前跳出循环//说明此时组里所有比end位置大的数均位于end + gap之后}}
}
完
相关文章:

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)
文章目录 前言1.插入排序(InsertSort)1.1 核心思路1.2 实现代码 2.选择排序(SelectSort)2.1 核心思路2.2 实现代码 3.冒泡排序(BubbleSort)3.1 核心思路3.2 实现代码 4.希尔排序(ShellSort&…...

Linux虚拟机空间扩容(新增磁盘并分区挂载)
1、命令shutdown -h now关闭虚拟机(要关机后再进行新增磁盘操作) 云平台进入虚拟机管理,新增磁盘 成功添加一块100G的磁盘 3、在Linux终端下执行该命令:lsblk 发现有新添加的磁盘。 也新增了/dev/vdb 3、分区 输入命令࿱…...

数据结构 ——— 直接选择排序算法的实现
目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现(默认升序) 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…...
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER() 是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。这个顺序号是基于窗口函数的 ORDER BY 子句进行排序的,可以根据指定的排序顺序生成连续的整数值。 ROW_NUMBER() 在分页、去重、…...

day24|leetCode 93.复原IP地址 , 78.子集 , 90.子集II
8.复原ip地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和"192.168.1.1" 是 有效 IP 地址,但是 "…...
RocketMQ: Broker 使用指南
Broker 配置参数 获取 Broker 的默认配置 $ sh mqbroker -m Broker 启劢时,如何加载配置 ### 第一步生成 Broker 默认配置模版 sh mqbroker -m > broker.p ### 第二步修改配置文件, broker.p ### 第三步加载修改过的配置文件 nohup sh mqbroker -c broker.pBrok…...

【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
文章目录: 【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行前言安装docker-centos7 【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行 💬欢迎交流:在学习…...

5、AI测试辅助-生成测试用例思维导图
AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐)2、Markdown思维导图版本(推荐) 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素: 1、测试模块 2、测试标题 3、前置条件 4、…...

nature communications论文 解读
题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…...

基于Java Springboot公园管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...

神经网络(系统性学习三):多层感知机(MLP)
相关文章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 神经网络(系统性学习二):单层神经网络(感知机) 多层感知机(MLP) 多层感…...

07-SpringCloud-Gateway新一代网关
一、概述 1、Gateway介绍 官网:https://spring.io/projects/spring-cloud-gateway Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防…...
HTML 表单实战:从创建到验证
HTML表单是用于收集用户输入数据的一种方式,可以用于创建各种类型的表单,例如登录表单、注册表单、调查问卷表单等。本文将详细介绍表单元素的使用,并利用JavaScript实现对表单数据的验证。 HTML表单元素的使用 输入框<input> <i…...

【redis 】string类型详解
string类型详解 一、string类型的概念二、string类型的常用指令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 SETNX2.6 INCR2.7 INCRBY2.8 DECR2.9 DECRBY2.10 INCRBYFLOAT2.11 APPEND2.12 GETRANGE2.13 SETRANGE2.14 STRLEN 三、string类型的命令小结四、string类型的内部编码五、strin…...

Vue.js 学习总结(13)—— Vue3 version 计数介绍
前言 Vue3.5 提出了两个重要概念:version计数和双向链表,作为在内存和计算方面性能提升的最大功臣。既然都重要,那就单挑 version 计数来介绍,它在依赖追踪过程中,起到快速判断依赖项有没有更新的作用,所以…...

【数据结构】【线性表】一文讲完队列(附C语言源码)
队列 队列的基本概念基本术语基本操作 队列的顺序实现顺序队列结构体的创建顺序队列的初始化顺序队列入队顺序队列出队顺序队列存在的问题分析循环队列代码汇总 队列的链式实现链式队列的创建链式队列初始化-不带头结点链式队列入队-不带头节点链式队列出队-不带头结点带头结点…...

2024年11月最新 Alfred 5 Powerpack (MACOS)下载
在现代数字化办公中,我们常常被繁杂的任务所包围,而时间的高效利用成为一项核心需求。Alfred 5 Powerpack 是一款专为 macOS 用户打造的高效工作流工具,以其强大的定制化功能和流畅的用户体验,成为众多效率爱好者的首选。 点击链…...
ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
问题现象:数据库客户端进程数据库连接成功后,再把跟数据库交互的网卡down掉,客户端进程就会阻塞,无法进行其他处理。该问题跟TCP keepalive机制有关。 可以在odbc.ini文件中增加相应的属性来解决,在odbc.ini 增加如下…...
VsCode使用git提交很慢(一直显示在提交)_vscode commit很慢解决方法
VsCode使用git提交很慢(一直显示在提交)_vscode commit很慢...

linux从0到1——shell编程9
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...

鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...

英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...