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

【C/C++ 01】初级排序算法

排序算法通常是针对数组或链表进行排序,在C语言中,需要手写排序算法完成对数据的排序,排序规则通常为升序或降序(本文默认为升序),在C++中,<algorithm>头文件中已经封装了基于快排算法的 std::sort() 函数,但是快速排序是不稳定的排序算法,于是<algorithm>中还包含了 stable_sort() 函数,即保留了等值元素的相对顺序。

稳定性:通常,在排序算法中,稳定性是指如果两个元素在原始数组中的相对顺序保持不变,则在排序后它们的相对顺序也应该保持不变。换句话说,如果有两个相等的元素,它们的位置在排序之前是 a 和 b,且 a 在 b 的前面,那么在排序后,a 仍然应该在 b 的前面。

在进行排序算法之前,先定义一个用于交换元素位置的函数:

void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

一、冒泡排序(Bubble Sort)

冒泡排序的核心算法是暴力求解思维,是指将所有元素都相互比较一次,若靠前的数比靠后的数大,则将两个数交换位置。

  • 排序对象:数组
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 是否稳定:是
void BubbleSort(int* arr, int n)
{for (int i = 0; i < n; ++i){for (int j = 0; j < n - i - 1; ++j){if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}}
}

二、插入排序(Insert Sort)

插入排序的核心算法是将当前遍历到的地方的末尾数据往前比较,找到合适的位置进行插入,直到遍历到最后一个数据。

  • 排序对象:数组、链表
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 是否稳定:是
void InsertSort(int* arr, int n)
{int i = 1;for (; i < n; ++i){int j = i;int end = arr[j];while (j > 0 && arr[j - 1] > end){arr[j] = arr[j - 1];--j;}arr[j] = end;}
}

三、选择排序(Select Sort)

选择排序的算法核心是找到数组的最大值和最小值,将其和遍历数组的左右端进行交换,然后左端右移、右端左移。简易版的选择排序算法会只找一个最值进行交换。

  • 排序对象:数组、链表
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 是否稳定:否
void SelectSort(int* arr, int n)
{int left = 0;int right = n - 1;while (left < right){int iMin = left; int iMax = right;for (int i = left; i <= right; ++i){if (arr[i] < arr[iMin])iMin = i;if (arr[i] > arr[iMax])iMax = i;} Swap(&arr[left], &arr[iMin]);if (left == iMax)iMax = iMin;Swap(&arr[right], &arr[iMax]);++left;--right;}
}

相关文章:

  • RabbitMQ之三种队列之间的区别及如何选型
  • 自然语言处理(NLP)技术使用
  • C#-正则表达式
  • Python PDF转换为图片的解决方案
  • 【leetcode100-077到080】【贪心】四题合集
  • 服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现
  • 机器学习:多项式回归(Python)
  • GIS应用水平考试一级—2009 年度第二次
  • SpringTask 整合
  • 硬件知识(2) 手机的传感器-sensor
  • 网络安全04-sql注入靶场第一关
  • getopt() 冒号规则
  • 【C语言】深入理解指针(4)回调函数
  • Apache Doris 2.0.4 版本正式发布
  • TensorFlow 的基本概念和使用场景
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【comparator, comparable】小总结
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Docker: 容器互访的三种方式
  • mongodb--安装和初步使用教程
  • Netty 4.1 源代码学习:线程模型
  • tab.js分享及浏览器兼容性问题汇总
  • WebSocket使用
  • 从零开始的无人驾驶 1
  • 分布式熔断降级平台aegis
  • 缓存与缓冲
  • 技术:超级实用的电脑小技巧
  • 简单数学运算程序(不定期更新)
  • 如何进阶一名有竞争力的程序员?
  • 微服务入门【系列视频课程】
  • 原生JS动态加载JS、CSS文件及代码脚本
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云API、SDK和CLI应用实践方案
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Linux(权限管理)
  • (day 12)JavaScript学习笔记(数组3)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)Flask之app.route装饰器函数的参数
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (定时器/计数器)中断系统(详解与使用)
  • (多级缓存)多级缓存
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (一)Java算法:二分查找
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • *** 2003
  • ***利用Ms05002溢出找“肉鸡
  • .apk 成为历史!
  • .gitignore文件---让git自动忽略指定文件
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别