当前位置: 首页 > news >正文

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言:生活中我们总是会碰到各种各样的排序,今天我们就对部分常用的排序进行总结和学习,今天的内容还是相对比较简单的一部分,各位一起加油哦!

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:数据结构 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


插入排序

插入排序:我们可以通俗的理解成将一个数记录下来按其数值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。(由于动图画的实在太过于繁琐博主就画了一半,请见谅)
请添加图片描述

代码思路:由此图我们可以知道,我们用一个tmp记录后面一个元素,如果后面的比前面的小,就让前面的元素逐一和他比较并往后走,如果碰到比他小的就停下来插入到此位置。(不理解的话可以理解成我们平常玩的斗地主的牌,拿一张牌插到应该有的位置)。


代码实现

void InsertSort(int* a, int n)//插入排序
{for (int i = 0; i < n - 1; i++)//升序{int end = i;int tmp = a[end + 1];//保存后一个while (end >= 0){if (tmp < a[end])//前一个大于后一个,让大的全部往后走{a[end + 1] = a[end];end--;}else{break;	}}a[end + 1] = tmp;//在把小的放在此时的位置}
}

测试函数:

void Test_InsertSort()
{int a[] = { 1,2,30,0,99,1,7,8,2,11,0,3,13 };InsertSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));
}

排序结果:
在这里插入图片描述


希尔排序

希尔排序:我们可以通俗的把待排的序列看成若干个子序列,然后对其分别进行直接插入排序,最后在对全部进行一次排序即可。(如下图所示)
在这里插入图片描述


我们可以理解成gap>1是预排序,目的是让它接近有序
gap == 1是直接插入排序,目的是让它有序。但是记住最后一定要让gap最后一次排序为1
代码思路:我们可以把每次排序写成一次插入排序,然后最后一让其间距不断的变化直到最后一次全部排序完成。
代码实现:

void ShellSort(int* a, int n)//希尔排序 
{int gap = n;while (gap){gap = gap / 2 ;for (int i = 0; i < n - gap; i++)//升序{int end = i;int tmp = a[end + gap];//保存后一个while (end >= 0){if (tmp < a[end])//前一个大于后一个,让大的全部往后走{a[end + gap] = a[end];end = end -gap;}else{break;}}a[end + gap] = tmp;//在把小的放在此时的位置}}
}

函数测试

void Test_ShellSort()
{int a[] = { 1,2,30,0,99,1,7,8,2,11,0,3,13 };ShellSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));
}

运行结果:
在这里插入图片描述


冒泡排序

冒泡排序:也是我们所碰到的最简单的一种排序,这种排序的思想是十分简单的,我们可以理解成每一趟找到序列中最大的一个或最小的元素,排序到序列的最左边(右边),然后排序序列的有效次数趟即可排序完成(如下图)。
请添加图片描述

代码实现:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void BubbleSort(int* a, int n)//冒泡排序
{int i = 0;for (int j = 0; j < n - 1; j++){for (i = 0; i < n - j -1; i++)//每一趟找到一个最大的{if (a[i] < a[i + 1]){Swap(&a[i], &a[i + 1]);}}}
}

函数测试:

void Test_BubbleSort()
{int a[] = { 1,2,30,0,99,1,7,8,2,11,0,3,13 };BubbleSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));
}

运行结果
在这里插入图片描述


选择排序

选择排序:我们现在一组有序序列中找到最大(最小)和第一个位置交换,然后再找次大的和第二个交换以此类推,最后我们即可得到一个有序序列。(如下图所示)
请添加图片描述


代码实现

void SelectSort(int*a ,int n)//选择排序
{//现在数组中找到最小的,然后和第一个位置交换//再找到次小的,和第二个位置交换int min = 0;for (int i = 0; i < n - 1 ; i++){min = i;//最小的数的下标for (int j = i; j < n; j++){if (a[min] > a[j])//找到最小位置的下标{min = j;}}if(min != i)Swap(&a[i], &a[min]);}
}

测试函数

void Test_SelectSort()
{//int a[] = { 1,2,30,0,99,1,7,8,2,11,0,3,13 };int a[] = { 1,0,0,0,99,1,7,8,2,9,0,3,0 };SelectSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));}

运行结果:
在这里插入图片描述


但是上面这种方法我们一共要找n-1次,我们思考一下每一次查找的过程中,如果我们每次一起查找最大的和最小的,那我们不就提高了一倍的效率。所以我们只需要再引入一个max变量来帮助我们再记录一下这个值即可。
代码实现

void SelectSort_best(int* a, int n)//选择排序
{int begin = 0;int end = n - 1;while (begin < end){int max = begin;int min = begin;int i = 0;for (i = begin + 1; i <= end; i++)//找最小的和最大的{if (a[i] < a[min]){min = i;}if (a[i] > a[max]){max = i;}}Swap(&a[begin], &a[min]);if (begin == max)//防止最大的和最小的是相同的{max = min;}Swap(&a[end], &a[max]);begin++;end--;}
}

运行结果依然和前面的相同,这里就不做更多的阐述了。


堆排序

堆排序:前面我们讲了的模拟实现,我们知道堆的父亲结点一定比它的孩子结点大(小),因此我们可以充分的利用这一点来进行排序。

  1. 首先我们们将数组中的元素,想象成一个堆,将其中的父亲结点全部向下调整。(如下图)在这里插入图片描述
  2. 根据我们模拟建立的大堆或者小堆,将其堆顶元素和堆尾进行交换,因此我们可以得到一个最大(最小的元素)再堆底,然后再通过一个end记录尾部,交换一次减减一次,以此循环到end为0的时候即堆中所有元素也排序完成。(如下图所示)
    在这里插入图片描述

代码实现:

void AdjustDown(int* a, int size, int parent)//向下调整
{assert(a);int child = parent * 2 + 1;//找到第一个孩子while (child < size){//看俩个孩子谁更小,交小的那个与父亲去比较if (a[child] < a[child + 1] && (child + 1) < size){child += 1;}if (a[parent] < a[child]){Swap(&a[parent], &a[child]);parent = child;//让父亲和儿子往下走child = child * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)//堆排序
{int i = 0;for (i = (n - 1 - 1) / 2; i >= 0; i--)//建堆,只有父亲结点需要调整{AdjustDown(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

函数测试:


void Test_HeapSort()
{int a[] = { 20,10,8,2,1,2,7 };HeapSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));
}

运行结果:
在这里插入图片描述


好啦,今天的内容就到这里啦,下期内容预告【快速排序的模拟实现】-- 四种方式


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🫵🫵🫵 祝各位接下来好运连连 💞

相关文章:

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言&#xff1a;生活中我们总是会碰到各种各样的排序&#xff0c;今天我们就对部分常用的排序进行总结和学习&#xff0c;今天的内容还是相对比较简单的一部分&#xff0c;各位一起加油哦&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f44…...

TiDB 7.5 LTS 发版丨提升规模化场景下关键应用的稳定性和成本的灵活性

互联网时代&#xff0c;数据的迅猛增长给数据库带来了可扩展性的挑战&#xff0c;Gen AI 带来的数据暴增更加剧了这种挑战。传统的数据分片已经不能承载新时代数据暴增的需求&#xff0c;更简单且具有前瞻性的方法则是采用原生分布式数据库来解决扩展性问题。在这种规模化场景的…...

服务器数据恢复-误操作导致xfs分区数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌OceanStorT系列某型号存储MD1200磁盘柜&#xff0c;组建的raid5磁盘阵列。上层分配了1个lun&#xff0c;安装的linux操作系统&#xff0c;划分两个分区&#xff0c;分区一通过lvm进行扩容&#xff0c;分区二格式化为xfs文件系统。 服务器…...

安装Kubernetes1.23、kubesphere3.4、若依项目自动打包部署到K8S记录

1.安装kubernetes1.23详细教程 kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎 2.安装rancher动态存储 kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml3.安装kubesphere3.4 准备工作 您…...

(三) `MaterializedMySQL`同步机制解读

当使用 ClickHouse 的 MaterializedMySQL 引擎进行全量同步时&#xff0c;它主要依赖于两个关键机制&#xff1a;初始全量数据导入和随后的增量更新。以下是这些机制的详细解释&#xff1a; 初始全量数据导入 读取现有数据: 当您在 ClickHouse 中创建一个 MaterializedMySQL 类…...

使用 stream 流构建树(不使用递归)

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言代码实现定义测试实体类实现方法 前言 最近遇到一个地区数据需要转换成树的需求&#xff0c;研究了一种…...

docker 部署 个人网页版 wps office

先声明一下&#xff0c;这个是用的linux桌面&#xff0c;然后安装了一个wps软件 安装好之后&#xff0c;通过我们自己的浏览器进行操作。。。。。 我只是试了一下&#xff0c;目前发现只能一个人用&#xff0c;里面还有谷歌浏览器&#xff0c;就是一个远程linux桌面 docker …...

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发&#xff08;以为tcp作为讲解&#xff0c;udp类似&#xff09; 选择转发器 输入监听地址&#xff08;SRC地址&#xff09;和端口 输入转发地址&am…...

抖音、小红书、视频号是如何判定是否限流的?

在这个新媒体营销的时代&#xff0c;抖音、小红书和视频号作为中国最受欢迎的社交媒体平台&#xff0c;为品牌和内容创作者提供了极具潜力的展示空间。然而&#xff0c;无论在哪个平台&#xff0c;限流成为很多人的苦恼。 抖音的推荐算法基于人群画像和初始流量池&#xff0c;同…...

frida native hook 技术( frida hook so层函数)

什么是hook&#xff1a; hook&#xff0c;中文译作”钩子“&#xff0c;”挂钩“&#xff0c;看起来好像和钓鱼有点关系&#xff0c;其实它更像一张网。想象这样一个场景&#xff1a;我们在河流上筑坝&#xff0c;只留一个狭窄的通道让水流通过&#xff0c;在这个通道上设一张网…...

SpringBoot运维(三)-- 多环境开发(yml多文件版)

目录 引言: 1. 多环境开发的配置 2. 多环境开发--根据功能拆分配置文件 引言: 多环境? 其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样࿰...

Vue 修饰符有哪些

事件修饰符 .stop 阻止事件继续传播.prevent 阻止标签默认行为.capture 使用事件捕获模式, 即元素自身触发的事件先在此处处理&#xff0c;然后才交由内部元素进行处理.self 只当在 event.target 是当前元素自身时触发处理函数.once 事件将只会触发一次.passive 告诉浏览器你不…...

哈希桶的模拟实现【C++】

文章目录 哈希冲突解决闭散列 &#xff08;开放定址法&#xff09;开散列 &#xff08;链地址法、哈希桶&#xff09;开散列实现&#xff08;哈希桶&#xff09;哈希表的结构InsertFindErase 哈希冲突解决 闭散列 &#xff08;开放定址法&#xff09; 发生哈希冲突时&#xf…...

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…...

FTP原理与配置

FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 FTP的应用 FTP 提供了一种在服务器和客户机之间上传和下载文件的有效方式。在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可…...

ios环境搭建_xcode安装及运行源码

目录 1 xcode 介绍 2 xcode 下载 3 xocde 运行ios源码 1 xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具&#xff08;IDE&#xff09;&#xff0c;由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计&#xff0…...

C++ 151. 反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随…...

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…...

48道Linux面试题

本博客将汇总 Linux 面试中常见的题目&#xff0c;并提供详细的解答。 文章目录 1、绝对路径用什么[符号表](https://so.csdn.net/so/search?q符号表&spm1001.2101.3001.7020)示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命…...

(13)Linux 进程的优先级、进程的切换以及环境变量等

前言&#xff1a;我们先讲解进程的优先级。然后讲解进程的切换&#xff0c;最后我们讲解环境变量&#xff0c;并且做一个 "让自己的可执行程序不带路径也能执行"的实践&#xff0c;讲解环境变量的到如何删除&#xff0c;最后再讲几个常见的环境变量。 一、进程优先级…...

1元一包的“干脆面”,为什么一年卖了近5亿包?——从康师傅财报看休闲食品的“新风口”!

近日&#xff0c;市场上出现了一个让人意想不到的现象&#xff1a;1元左右就能买到的一包干脆面&#xff0c;竟然在2025年卖出了接近5亿包&#xff01;这一现象背后&#xff0c;折射出了方便面行业从“主食”向“休闲零食”角色的成功转变&#xff0c;以及消费观念的深刻变迁。…...

React-PDF自定义字体粗细终极指南:实现精确文本字重控制的完整教程

React-PDF自定义字体粗细终极指南&#xff1a;实现精确文本字重控制的完整教程 【免费下载链接】react-pdf &#x1f4c4; Create PDF files using React 项目地址: https://gitcode.com/gh_mirrors/re/react-pdf React-PDF是一个功能强大的库&#xff0c;允许开发者使用…...

Bitahub算力上新 RTX3080 10G重磅登场

针对当前 AI 开发与科研场景中算力成本高、配置复杂的痛点&#xff0c;Bitahub 平台推出了 RTX3080 10G 显卡算力服务。该显卡具备 10GB 显存&#xff0c;能够满足模型训练、推理等多场景算力需求&#xff0c;同时平台定价极具竞争力&#xff1a;单卡低至 0.82 元 / 小时&#…...

Debugging torch.distributed.DistBackendError: NCCL Communicator Setup and ncclUniqueId Retrieval Iss

1. 理解NCCL通信错误的核心问题 当你看到torch.distributed.DistBackendError: [2] is setting up NCCL communicator and retrieving ncclUniqueId这个错误时&#xff0c;本质上是在说GPU之间的"对讲机"无法正常建立连接。想象一下你正在组织一场多房间的线上会议&…...

【PAT甲级真题】- Is It a Binary Search Tree (25)

题目来源 Is It a Binary Search Tree (25) 题目描述点击链接自行查看 注意点&#xff1a; 这里的二叉搜索树大于等于插到右边 思路简介 一道二叉树模板题&#xff08;6202年了应该不会还有人不会写二叉树吧bushi &#xff09; 一开始想到前序遍历不可能确定一棵树还以为题目…...

SGMICRO圣邦微 SGM6512YTS28G/TR TDFN-8L(2x2) 模拟开关/多路复用器

特性 典型导通电阻240120开路电阻平坦度3.3V至6V双电源供电操作3.3V至13.2V单电源工作电压-3dB带宽:70MHz轨到轨操作提供绿色TQFN-5x5-32L和TSSOP-28封装 工作温度范围:-40C至85C...

小白程序员必看:收藏这份上下文工程指南,轻松玩转大模型!

本文深入浅出地介绍了上下文工程在大语言模型中的重要性&#xff0c;阐述了指令、示例、知识、记忆、工具和安全护栏等六种上下文类型。文章详细解析了上下文工程的四个基本阶段&#xff1a;撰写上下文、选择上下文、压缩上下文和隔离上下文&#xff0c;并强调了上下文窗口的作…...

从零开始手搓一个xv6内核页表:跟着MIT 6.S081源码一步步理解虚拟内存初始化

从零构建xv6内核页表&#xff1a;深入解析RISC-V虚拟内存初始化实战 在MIT 6.S081操作系统的学习过程中&#xff0c;xv6作为教学用精简内核&#xff0c;其虚拟内存实现是理解现代计算机内存管理的关键。本文将带您从第一行代码开始&#xff0c;完整复现xv6内核页表的构建过程&…...

保姆级教程:用Coze零代码打造一个能聊天的微信公众号机器人(附服务器配置避坑指南)

零基础玩转Coze&#xff1a;从智能体创建到微信公众号部署全指南 在数字化营销日益重要的今天&#xff0c;拥有一个能24小时响应客户需求的智能客服已成为许多企业的标配。但对于没有技术背景的运营和市场人员来说&#xff0c;开发一个功能完善的聊天机器人似乎遥不可及。Coze平…...

ANARCI抗体序列分析工具:从入门到精通的专业指南

ANARCI抗体序列分析工具&#xff1a;从入门到精通的专业指南 【免费下载链接】ANARCI Antibody Numbering and Antigen Receptor ClassIfication 项目地址: https://gitcode.com/gh_mirrors/an/ANARCI ANARCI&#xff08;Antibody Numbering and Antigen Receptor Class…...