【算法篇】——数据结构中常见八大排序算法的过程原理详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、插入排序
    • 1.直接插入法
    • 2.希尔排序法
  • 二、交换排序
    • 1. 冒泡排序
    • 2. 快速排序
  • 三、选择排序
    • 1. 简单选择排序
    • 2. 堆排序
  • 四、归并排序
  • 五、基数排序


前言

C++数据结构中的排序算法是编程基础中的重要内容。本文将介绍八大经典排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序和计数排序。每种算法都有其独特的优势和应用场景,从小规模数据到大规模数据,从简单的整数排序到复杂的排序需求。通过理解和应用这些算法,可以更好地解决实际编程中的排序问题,提升程序性能和效率。
八大排序性能对比表
“不改变相同元素的相对排布,即为稳定”
在这里插入图片描述

一、插入排序

1.直接插入法

核心的思想:和前面的比,找到对应的位置插入(对应的位置是指,使得该位置的前面的数都是有序数的位置)
在这里插入图片描述
流程(从小到大排)
1.取数组中的第一个
2.取数组中的第二个,从后往前,前面的逐个对比,若比前面的小,则往前移,
3.取数组中的第三个,从后往前,前面的逐个对比,若比前面的小,则往前移,
n.依次类推,取数组中的第n个,从后往前,前面的逐个对比,若比前面的小,则往前移

2.希尔排序法

核心的思想:对每个子表进行直接的插入排序
子表
在这里插入图片描述
流程
在这里插入图片描述
流程(从小到大)
1.第一趟:步长d=4时,分割的子表为:[49,76],[38,13],[65,27],[97,49]
对每个子表执行直接插入排序,得到第一次排序数组为
[49,13,27,49,76,38,65,97]

2.第二趟:步长d=d/2=2时,在第一次排序的基础上:[49,13,27,49,76,38,65,97]
分割的子表为:[49,27],[76,65],[13,49],[38,97]
对每个子表执行直接插入排序,得到第二次排序数组为
[27,13,49,38,65,49,76,97]

3.第三趟:步长d=d/2=1时,在第二次排序的基础上:[27,13,49,38,65,49,76,97]
分割的子表为:[27,13],[49,38],[65,49],[76,97]
对每个子表执行直接插入排序,得到最终的排序数组为
[13,27,38,49,49,65,76,97]

注意:一般第一趟的步长,题目都会给,不然就去取d=数组的大小/2,每次的步长取上一次的步长的1/2。

二、交换排序

1. 冒泡排序

核心的思想:从后两两相比,更小的往后放
流程
在这里插入图片描述
示例:

#include<iostream>
#include<vector>
using namespace std;
void swap1(int &a,int &b)
{
	int temp = a;
	a = b;
	b = temp;
}
void Sort(vector<int> &c,int n) {
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n;j++) {
			if (c[i] > c[j]) {
				swap1(c[i], c[j]);
			}
		}
	}
}
int main() {
	int n; 
	cin >> n;         //输入排序的元素的个数
	cout << "数日排序元素的大小:" << endl;
	vector<int> c(n);
	for (int i = 0; i < n;i++) {
		cin >> c[i];  //输入排序的元素
	}
	Sort(c, n);    //进行冒泡排序
	cout << "排序后的数位" << endl;
	for (auto c1 : c) {
		cout << c1 <<" "  ;
	}
	system("pause");
	return 0;
}

优化冒泡排序的思路:
增加一个判断是否交换的标志,如果某一轮的排序中,没有发生交换,则结束排序算法(代表已经排好序了)

2. 快速排序

快排的打油诗
小放枢轴左,大放枢轴右;
高低所指换,换针向枢轴;
高低所遇处,枢轴所落入;
递归再排至,左右仅一头。

流程
1.选择枢轴:选择数组的第一个元素为枢轴值(上述例子的49)
2.定义高低移动的双指针:数组的两头
3.每次移动前都和枢轴进行判断
注意:一开始是高指针和枢轴进行对比(枢轴选择第一个元素,相当于低指针的初值)
a.指针和枢轴的值比较,如果相等:当前运动的指针移一位(高向前移,低向后移),继续移动当前指针进行对比判断。
b.指针和枢轴的值比较,如果不等:当前指针的值比枢轴,那就将当前指针的值放在低指针的位置;反之,放在高指针的位置(小放枢轴左,大放枢轴右);然后换指针运动,将当前运动的指针换成另外一个进行运动

4.直到两个指针相遇:该位置即为对应的值,应该所处的位置。
在这里插入图片描述
5.再进行递归快排
在这里插入图片描述
a.对第一次快排的结果,从第一次的枢轴的值49处,进行分区间执行快排,
在这里插入图片描述
b.直到左右仅一头

程序的实现,思考两个问题:
1.如何实现分区的逻辑?
如何返回每个区间的枢轴
2.如何控制分区的次数?
实际上是一个二叉树的遍历的问题,可使用递归
示例:

#include<iostream>
#include<vector>
using namespace std;
//进行分区
int partition(vector<int> &A, int slow, int fast) {
	int pos_nums = A[slow];
	while (slow < fast) {
		//注意:下面的while一定要加上slow < fast这个条件,这里并不是多余的,当排序的数组为:23,56,23,652,32,45,即第一个元素为最小值时,
		//会出现fast一直将为负数的情况出现,血的教训!!!
		while (A[fast] >= pos_nums && slow < fast) {
			fast--;
			//cout << "fast的值为:" << fast << endl;
		}
		A[slow] = A[fast];
		while (A[slow] <= pos_nums && slow < fast) {
			slow++;
		}
		A[fast] = A[slow];
	}
	A[slow] = pos_nums;
	return slow;
}
//递归排序
void Quicksort(vector<int>& A, int low, int hight) {
	if (low < hight) {
		int pos = partition(A, low, hight);
		Quicksort(A, low, pos - 1);
		Quicksort(A, pos + 1, hight);
	}
}
int main() {
	int n;
	cout << " 请输入排序的序列的大小  " << endl;
	cin >> n;
	vector<int> c(n);
	cout << "请输入排序的元素:" << endl;
	for (int i = 0; i < n; i++) {
		cin >> c[i];
	}
	Quicksort(c, 0, c.size() - 1);
	cout << "排列后数组为:" << endl;
	for (const auto& elem : c) {
		cout << elem << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

三、选择排序

1. 简单选择排序

核心思想:先扫(遍历一遍),再找(找到最小的),放在最前(和第一个元素交换)

流程
在这里插入图片描述

2. 堆排序

堆排序口诀
先建堆,再找数;
找一次,建一次;
找到数,就输出;
输出完,排序完;
流程在这里插入图片描述
大根堆含义:根节点的值 > 左,右孩子节点的值
(1). 建立大根堆
a. 例如上述上午数组[49,38,65,97,76,13,27,49]建立的二叉树结构为:
在这里插入图片描述
b. 构建大根堆
原则:让大元素上升,小的元素下坠,直到构建完成
检查具有孩子节点的根节点,如上述的例子,即为节点97,38,65,49,将数值最大给父节点。
操作如下
比如,上述的38节点,有孩子节点97,36,父节点的值不是最大值,那么将最大值97和父节点38互换,重复这个步骤,检查完所有的父节点。
构建的第一次大根堆为:
在这里插入图片描述
(2). 再找数
找数:找大根堆的根节点(即这个数组的最大值
输出:将根节点的值保存,并将根节点的位置的值换成,堆中的最后一个元素的值,
在这里插入图片描述
(3) 找一次,建一次
经过**(2)**输出最大的结果之后,再将新的二叉树结构进行重新排列,使其满足大根堆的条件:
在这里插入图片描述
最后再输出最大值,替换根节节点的数值,重复(1),(2)的步骤,直到结束

四、归并排序

核心的思想把两个有序的数组,并为一个有序的数组
方法:另外建表,分别从两序列的头依次对比

例程数组:
在这里插入图片描述
注意单个元素属于也属于有序的数组
流程:
1.另外建表:将数组分成有序的数组(单个元素的数组):
在这里插入图片描述
2.依次对比:分别进行两序列的头依次对比,数值小的往新表中添加
在这里插入图片描述

3.同理,重复上述的步骤,得到排序后的结果:
在这里插入图片描述

五、基数排序

例程数组
在这里插入图片描述
设置的排序的列表
在这里插入图片描述

流程
存储的结构是链式的结构:49->38->65->97->76->13->27->49
1.看个位数:例如,第一个元素49,个位数为9,那么排到Q9的位置,同理,排其他的数字,如下图所示:
在这里插入图片描述
得到的初次排序:49->49->38->97->27->76->65->13

2.看十位数:例如,第一个元素49,个位数为9,那么排到Q9的位置,同理,排其他的数字,如下图所示:
在这里插入图片描述
最终的排序:97->76->65->49->49->38->27->13
这个排序他是稳定的,因为”基你太稳!!!“

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仿闲鱼的二手交易小程序软件开发闲置物品回收平台系统源码

市场前景 闲置物品交易软件的市场前景广阔&#xff0c;主要基于以下几个方面的因素&#xff1a; 环保意识提升&#xff1a;随着人们环保意识的增强&#xff0c;越来越多的人开始关注资源的循环利用&#xff0c;闲置物品交易因此受到了广泛的关注。消费升级与时尚节奏加快&…

情报信息收集能力

红队专题-Web渗透之资产思路框架知识整理 钓鱼社工 钓鱼自动化zip域名ARP欺骗快捷方式ToolsburpsuiteApp 抓包ffuf模糊测试QingScanWiresharkCloudCFEn-Decodeffffffff0xInfodirbdirmapdirsearchdnsenum使用测试常规使用使用字典文件进行dns查询子域名暴力查询部分C类IP地址IP块…

ensp 关于acl的运用和讲解

ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种常用于网络设备&#xff08;如路由器、交换机&#xff09;上的安全机制&#xff0c;用于控制数据包的流动与访问权限。ACL 可以指定哪些数据包允许进入或离开某个网络接口&#xff0c;基于不同的…

5、mysql的读写分离

主从复制 主从复制的含义 主从复制&#xff1a;在一个mysql的集群当中&#xff0c;至少3台&#xff0c;即主1台&#xff0c;从2台。 当有数据写入时&#xff0c;主负责写入本库&#xff0c;然后把数据同步到从服务器。 一定是在主服务器写入数据&#xff0c;从服务器的写入…

高质量配音如何影响游戏的受欢迎度

在游戏行业中&#xff0c;创造沉浸式、引人入胜且令人难忘的体验往往决定了游戏的成功或失败。在影响游戏流行度的众多因素中&#xff0c;配音脱颖而出&#xff0c;成为将叙事与玩家互动连接起来的重要元素。高质量的配音将游戏中的对白转化为游戏的活跃部分&#xff0c;让玩家…

鸿蒙-expandSafeArea使用

应用未使用setWindowLayoutFullScreen()接口设置窗口全屏布局时&#xff0c;默认使能组件安全区布局。可以使用expandSafeArea属性扩展安全区域属性进行调整 扩展安全区域属性原理 布局阶段按照安全区范围大小进行UI元素布局。布局完成后查看设置了expandSafeArea的组件边界&…

Java测试开发平台搭建(四)拦截器

1. 拦截器的作用及使用场景 能够在请求的生命周期的不同阶段进行拦截和处理。常见的使用场景包括&#xff1a;1. 日志记录&#xff1a;记录请求和响应的日志。 2. 权限验证&#xff1a;检查用户的登录状态、权限。 3. 性能监控&#xff1a;记录请求的处理时间&#xff0c;监控…

window安装TradingView

目录 下载安装包 修改文件后缀&#xff0c;解压 将K线换成国内涨红跌绿样式 下载安装包 https://www.tradingview.com/desktop/ 下载完成后是.msix格式文件 &#xff08;我在win10和win11的系统中尝试运行msix都没有成功&#xff0c;所以放弃直接双击运行msix&#xff…

电子应用设计方案70:智能挂钟系统设计

智能挂钟系统设计 一、引言 随着科技的不断发展&#xff0c;传统挂钟也逐渐向智能化方向演进。智能挂钟不仅能够准确显示时间&#xff0c;还具备多种实用功能和智能交互特性&#xff0c;为用户带来更便捷、丰富的体验。 二、系统概述 1. 系统目标 - 高精度显示时间&#xff0…

vue+elementui实现下拉表格多选+搜索+分页+回显+全选2.0

一、vueelementui实现下拉表格多选搜索1.0 二、vueelementui实现下拉表格多选搜索分页回显全选2.0 在1.0的基础上&#xff0c;终于可以实现在下拉框表格分页的前提下不同页码的回显辣&#xff0c;分页是前端来分页的&#xff08;代码略乱且没有封装还很长&#xff0c;随便看看…

被裁20240927 --- 嵌入式硬件开发 前篇

前篇主要介绍一些相关的概念&#xff0c;用于常识扫盲&#xff0c;后篇开始上干货&#xff01; 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…

【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)

最近在忙联通的安全准入测试&#xff0c;很少有时间看CTF了&#xff0c;今晚抽点时间回顾下上周线下的题(期末还没开始复习&#x1f622;) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞&#xff0c;没啥惊喜感&#xff0c;还是CTF有意思 目录 Mountain ez_zhuawa 图…

高阶:基于Python paddleocr库 提取pdf 文档高亮显示的内容

预览 第1步&#xff1a;理解基本结构和导入必要的库 # 1. 首先导入需要的库 import os # 用于处理文件和路径 import cv2 # 用于图像处理 import numpy as np # 用于数值计算 from paddleocr import PaddleOCR # 用于文字识别 from pdf2image import convert_from_path #…

保护模式基本概念

CPU 架构 RISC&#xff08;Reduced Instruction Set Computer&#xff09; 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的&#xff08;如ARM是32位的指令&#xff09;、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…

@vue/cli启动异常:ENOENT: no such file or directory, scandir

参考:https://blog.csdn.net/qq_44355188/article/details/122239566 首先异常报错是&#xff1a;ENOENT: no such file or directory, scandir ‘D:\Data\Project\VueProject\hello\node_modulesvue\cli-plugin-eslint\locales’&#xff1b;我的vue/cli版本是 4.5.15 重点是…

全视通物联数据中台解决方案助力智慧医院新时代

全国医院物联网大会系列活动暨【行走的课堂】标杆研学 四川站“医院物联网应用创新经验交流会”&#xff0c;近日在成都召开。珠海全视通信息技术有限公司总经理林三朝以《物联网技术助力医院高质量发展》为题做了精彩演讲。林总就物联网技术如何助力医院高质量发展&#xff0c…

QT程序发布后,mysql在其它电脑设备无法连接数据库

QT程序发布后&#xff0c;mysql在其它电脑设备无法连接数据库 D:\mysql-5.7.24-winx64\lib, mysql-5.7.24-winx64是一个压缩包&#xff0c;用于启动mysql服务&#xff0c;创建数据库 压缩包 解决方法&#xff1a; 拷贝库到exe的相同目录&#xff0c;libmysql.dll,libmysql.li…

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip&#xff0c;发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面&#xff0c;前者提示我们什么也没有&#xff0c;后面两个没有权限访问 扫描端口&#xff0c;存在81端口 访问&#x…

CNN、RNN、LSTM和Transformer之间的区别和联系

文章目录 CNN、RNN、LSTM和Transformer之间的区别和联系前言CNN&#xff08;卷积神经网络&#xff09;RNN&#xff08;循环神经网络&#xff09;LSTM&#xff08;长短期记忆网络&#xff09;Transformer四者之间的联系与区别Yolo算法简介Yolo和CNN的关系YOLO各版本 CNN、RNN、L…

f(f(x))=x^2 -11x+36, 求f(6)的值,

偶然看到的一个题目&#xff0c;一时兴起&#xff0c;做了一下。题目如下 简单粗暴的思路是待定系数法&#xff0c;盲猜f(x)是个2次函数&#xff0c;令f(x)ax^2bxc ,带入原式&#xff0c;发现矛盾&#xff08;计算略&#xff09;就想放弃了。 忽然看到如果带入6 的话&#xf…