史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法,有需要的小伙伴可以移步史上最全排序算法整理(1)查看相关内容哦

1.冒泡排序

1.1基本思想

在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。

1.2特性总结

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定

1.3代码实现

void BubbleSort(int* a, int n) 
{for (int j = 0; j < n - 1; j++){int exchange = 0;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

2.快速排序

2.1基本思想

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。

任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中的所有元素均大于基准值,然后对左右子序列重复该过程,直到所有元素都排列在相应的位置上为止。

2.2优化方法

选择key时采用三数取中法

递归到小子区间的时候,考虑使用插入排序

2.3特性总结

  • 时间复杂度:O(N*logN)
  • 空间复杂度:O(logN)
  • 稳定性:不稳定。其元素比较和交换是跳跃进行的,因此它是一种不稳定的排序算法。

2.4代码实现

//快排三数取中
int GetMidi(int* a, int left, int right)
{int mid = (left + right) / 2;if (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] > a[right]){return left;}else{return right;}}else//a[left]>=a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] < a[right]){return left;}else{return right;}}
}//Hoare
void QuickSort1(int* a, int left, int right) 
{//区间只有一个值或者不存在的就是最小子问题if (left >= right)return;//小区间选择走插入,可以减少90%左右的递归if (right - left + 1 < 10){InsertSort(a + left, right - left + 1);}else{int begin = left, end = right;int midi = Getmidi(a, left, right);Swap(&a[left], &a[midi]);int keyi = left;while (left < right){//right先走找小while (left < right && a[right] >= a[keyi]){right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[left], &a[keyi]);keyi = left;QuickSort1(a, begin, keyi - 1);QuickSort1(a, keyi + 1, end);}
}//快速排序-前后指针
void QuickSort2(int* a, int left, int right) 
{if (left >= right)return;int keyi = left;int prev = left;int cur = left + 1;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur){Swap(&a[prev], &a[cur]);}++cur;}Swap(&a[keyi], &a[prev]);keyi = prev;QuickSort2(a, left, keyi - 1);QuickSort2(a, keyi+1, right);
}

 3.归并排序

3.1基本思想

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的典型应用。将已有序的子序列合并,得到完全有序的序列

即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并。

3.2特性总结

  • 时间复杂度O(N*logN) 
  • 空间复杂度O(N)
  • 稳定性:稳定

3.3代码实现

void _MergeSort(int* a, int begin, int end, int* tmp)
{if (begin == end)return;int mid = (begin + end) / 2;_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid + 1, end, tmp);int begin1 = begin, end1 = mid;int begin2 = mid + 1,end2 = mid;int i = begin;//依次比较,取较小的尾插while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end1){tmp[i++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
//归并
void MergeSort(int* a, int n) 
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, 0, n - 1, tmp);free(tmp);tmp = NULL;
}

3.4归并排序的非递归

 相比于递归算法,归并排序的非递归算法不用多次调用同一个函数,不会向递归算法一样因为函数嵌套调用次数太多而造成栈溢出。 相比于递归的算法,非递归与之不同点就一个:在递归中我们通过递归到最底层(即两个数一组)进行排序,而非递归则是直接把数组分成两个数一组进行排序,这边排序完之后,再把数组分成四个一组排序,直到整个数组被分成两组,排序后就结束。

void MergeSortNonR(int* a, int n) 
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int j = 0; j < n; j += 2 * gap){int begin1 = j, end1 = begin1 + gap - 1;int begin2 = begin1 + gap, end2 = begin2 + gap - 1;//越界处理if (end1 >= n || begin2 >= n)break;if (end2 >= n)end2 = n - 1;int i = j;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end1){tmp[i++] = a[begin2++];}memcpy(a + j, tmp + j, sizeof(int) * (end2 - j + 1));}gap *= 2;}free(tmp);tmp = NULL;
}

4.非比较排序之计数排序

前面我们介绍的排序都是通过比较实现的,下面我们来看看一个常见的非比较排序

4.1基本思想

遍历原数组,统计相同元素出现的个数,一个值出现了几次,映射的位置次数就被增加几,然后根据统计的结果将序列回收到原来的序列中。

4.2特性总结

  • 计数排序在数据范围集中地时候,效率很高,但是适用的范围很有限
  • 时间复杂度:O(MAX(N,范围))
  • 空间复杂度:O(范围) 
  • 稳定性:稳定

4.3代码实现

void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//先根据最大值和最小值求出范围int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");return;}memeset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[a[i] - min]++;}int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}

排序算法汇总

以上就是小编对排序算法的全部介绍啦

欢迎大家在评论区留言讨论

点赞+评论+关注,是博主不断更新优质文章的动力哦~

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

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

相关文章

【解决npm install -g windows-build-tools的安装问题】

解决npm install -g windows-build-tools的安装问题 https://developer.huawei.com/consumer/cn/forum/topic/0203740461436730610?fid26

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd&#xff0c;执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件&#xff0c;用记事本打开&#xff0c;并…

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、优点四、缺点五、怎么用六、细节 Spring Cloud Consul 一、需求 多个微服务之间通过RestTemplate中的api相互调用&#xff0c;一般要写死微服务的IP地址和端口号&#xff0c;相当于硬编码&#xff0c;非常不灵活&#xff0…

MyBatis出现:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本质上来说&#xff0c;是Mybatis使用上的错误&#xff0c;不熟悉&#xff0c;理…

C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。

哈喽,你好啊,我是雷工! 前边学习了SQLServer数据库相关的增删改查的基本操作, 上节练习了C#通过ADO.NET技术和SQLServer数据库建立连接和断开连接的写法, 本节继续学习ADO.NET的相关操作,下面为向数据库中插入数据的相关练习笔记。 01 向数据库插入数据 插入数据的过程…

SQL函数--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于结合两个或更多 SELECT 语句的结果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重复的行。这与 UNION 不同&#xff0c;因为 UNION 会自动删除重复的行。 满足条件&#xff1a; 1、两个select查询的列的数量必须相…

web前端柜架图片:探索与解析

web前端柜架图片&#xff1a;探索与解析 在web前端开发的世界里&#xff0c;图片的处理与展示是一项至关重要的任务。而“web前端柜架图片”这一概念&#xff0c;可能初听起来让人有些困惑&#xff0c;它究竟指的是什么&#xff1f;在本文中&#xff0c;我们将从四个方面、五个…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

CCF-GESP 等级考试 2023年3月认证C++一级真题

2024年03月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 第 1 题 以下不属于计算机输入设备的有&#xff08; &#xff09;。 A. 键盘B. 音箱C. 鼠标D. 传感器 第 2 题 计算机系统中存储的基本单位用B来表示&#xff0c;它代表的是&#xff08; &#x…

企业网络的“瑞士军刀”:探索“一端多能”设备的多面性

在数字化时代&#xff0c;企业网络需求的复杂性和多样性不断增长&#xff0c;传统的单一功能网络设备已难以满足这些需求。企业需要一种集多种功能于一身的“一端多能”网络设备&#xff0c;以应对各种网络环境和业务需求&#xff0c;就像是一把多功能、灵活、可靠的瑞士军刀&a…

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

测试基础07:测试工作流程规范、进度同步与把控

课程大纲 1、迭代测试流程 2、测试流程 2.1、测试用例评审 目的&#xff1a;对齐产品需求理解&#xff0c;完善、优化测试场景。 参与方&#xff1a;项目、产品、开发、测试。 用例内容&#xff1a;冒烟用例&#xff08;主流程&#xff09; 功能用例。 2.2、冒烟测试 提测…

SOLIDWORKS正版价格多少钱

SOLIDWORKS作为目前应用较为广泛的3D CAD软件之一&#xff0c;具有强大的功能和实用性&#xff0c;它为各类工程设计提供综合解决方案。但是&#xff0c;正版SOLIDWORKS价格是个不可忽视的问题。那SOLIDWORKS的正版价格究竟如何呢&#xff1f;又是受什么因素影响&#xff1f; 先…

【论文阅读|cryoET】ICE-TIDE

简介 三维cryoET重建的保真度进一步受到采集过程中物理扰动的影响。这些扰动以各种形式表现出来&#xff0c;例如连续采集之间的样本漂移&#xff0c;导致连续投影未对准&#xff0c;或者由于未散射的电子而导致二维投影中的局部变形。 传统的冷冻电子断层扫描工作流程需要对…

单片机编程的code关键字的诠释

在单片机编程中&#xff0c;code 是一个关键字&#xff0c;用于指示编译器将变量存储在程序存储器中&#xff0c;而不是在数据存储器中。通常情况下&#xff0c;程序存储器的速度比数据存储器的速度更快&#xff0c;而且程序存储器的容量较小&#xff0c;适合存储常量数据和程序…

mybatis加密数据库信息

1.配置MyBatisConfig.xml <environments default"development"><!-- 默认--><environment id"development"><transactionManager type"JDBC"/><dataSource type"POOLED"><property name&quo…

朗读亭主要作用有哪些?

朗读亭的主要作用有以下几个方面&#xff1a; 1. 提供朗读服务&#xff1a;朗读亭是一个专门的场所&#xff0c;提供给人们朗读的环境和场地。人们可以在朗读亭中选择自己喜欢的书籍或文章&#xff0c;并通过朗读将其表达出来。这样可以帮助人们提高朗读能力&#xff0c;增强自…

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比较简单&#xff0c;就一个异或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要输入九个数&#xff0c;然后进入处理和判断&#xff0c;如果满足条件则进入输出flag部分&#xff0c;flag和输入有关&#xff0c;所以要理解需要满足什么…

【408真题】2009-27

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…