十大经典排序算法(代码实现),建议收藏

一口Linux 2020-10-20 00:00


前言


兜兜转转,一晃年关将至。时间证明了一个道理,学啥忘啥,学的越快忘得越快,还不如踏踏实实写点笔记心得来的实在。


编程初学期间,排序算法是让人抓头最多的一块。为什么我连最简单的冒泡排序都理解不了,我是不是不选错专业了,很多人会有这样的疑问,然后就有人做gif冒泡懵逼排序,别说,还挺形象的。


其实排序算法这块,着急不得,这个排序算法不会就换一个排序算法来学,总有一种排序算法你能够理解的,等需要用到排序的时候,你只要会一种就可以了。


在这里我列举了7中常见的排序算法并用C语言实现,你们可能就要问了,不是十种吗?怎么还能缺斤短两,不是我不会写啊,是写起来麻烦,你们也用不到后面那几种,跟别说去研究了,能看懂常见的七种排序算法你就能在学校里横着走了。


后台回复【排序算法】可以拿到全部代码



目录






一、冒泡排序
二、选择排序
三、插入排序
四、快速排序
五、希尔排序
六、归并排序
七、桶(基数)排序



01
冒泡排序




相信大家最熟悉的就是冒泡排序了,这个我就不多说


直接上动图演示原理,外加代码实现冒泡排序:





C语言代码实现:

void BubbleSort(int arr[], int n){ //从小到大排序 相邻来两个数比较,将大的数字往后放 for (int i = 0; i < n - 1; i++) //n-1是因为数组下标最大为n-1 要进行10轮比较 { //n-1是因为数组下标最大为n-1 要进行10次比较,再减i是因为每最后的i个元素已经有序不需要继续排序 for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) //两两比较,将小的数据放前面 {        swap(arr, j + 1, j);        //交换arr数组arr[j+1]和arr[j]的值 } } }}//交换函数后面就不列举了,凡是swap都是下面代码实现的void swap(int arr[], int x, int y){ int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp;}


02
选择排序




首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,重复操作。


动图演示原理,外加代码实现选择排序:





C语言代码实现:

void SelectSort(int arr[], int n){ for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (arr[i] > arr[j]) { swap(arr, i, j); //交换arr数组arr[i]和arr[j]的值 } } }}


03
插入排序




插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的,就是将未排序的数字插入到已排序的数列中


动图演示原理,外加代码实现插入排序:





C语言代码实现:

void InsertSort(int arr[], int n){ int tempVal; for (int i = 1, j; i < n; i++) { tempVal = arr[i]; //保存要插入的值 for (j = i - 1; tempVal < arr[j] && j >= 0; --j) //数据往后移动,给要插入的值腾位 { arr[j + 1] = arr[j]; } arr[j + 1] = tempVal; //插入数据 }}


04
快速排序




快速排序由于涉及到递归,理解起来难度是最大的,但是如果你静下心来独自对一组数组用快速排序的原理进行排序就能够很快的理解它,也能够理解递归的原理。


动图演示原理,外加代码实现选择排序:





C语言代码实现:

void QuickSort(int arr[], int left, int right){ if (left >= right) return; //只有一个元素不排 int i = left, j = right; while (i < j) { while (i < j&&arr[j] >= arr[left]) //从右向左找第一个小于arr[left]的数 --j; while (i < j&&arr[i] < arr[left]) //从左向右找第一个大于等于arr[left]的数 ++i; if (i < j) swap(arr, i, j); } QuickSort(arr, left, i - 1);//排左边 QuickSort(arr, i + 1, right);//排右边}


05
希尔排序




希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。插入排序是将未排序的数字插入到已排序数列中,而希尔排序是将一个已排序的数列插入到另一个已排序的数列中。


示意图演示原理,外加代码实现希尔排序:





C语言代码实现:

void ShellSort(int arr[], int n){ int tempVal, j; int jump = n >> 2; //步长值 while (jump != 0) { for (int i = jump; i < n; i++) { tempVal = arr[i]; //保存待排序的第一个数,也就是待插入的数 for (j = i - jump; j >= 0 && tempVal < arr[j]; j -= jump) { arr[j + jump] = arr[j]; } arr[j + jump] = tempVal; } jump = jump >> 1; //步长值减半 }}


06
归并排序




归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。


示意图演示原理,外加代码实现归并排序:





C语言代码实现:

void MergeSort(int arr[], int left, int right){ if (left >= right)//递归的终止条件,left == right证明这个区间只有一个元素,不需要再拆了 return; int mid = ((right - left) >> 1) + left;//求中点 MergeSort(arr, left, mid); //拆分左 MergeSort(arr, mid + 1, right); //拆分右 //并操作 _merge_in_arr(arr, left, mid, right);}
void _merge_in_arr(int arr[], int left, int mid, int right){ int length = right - left + 1; //定义一个辅助的空间的长度 int *pData = (int*)malloc(sizeof(int)*length);//分配一个动态内存来调整元素的位置 memset(pData, 0, sizeof(int)* length);
//合并 int low = left; //左边区间的起始下标 int hig = mid + 1; //右边区间的起始下标 int index = 0; //辅助数组的下标
while (hig <= right)//右区间没有合并完 { while (low <= mid && arr[low] <= arr[hig])//证明左区间没有合并完,且左区间的值小于右区间的值 { pData[index] = arr[low]; //把左边的值放进辅助数组 low++; //左边往高位移,下一次需要判断左边的新下标 index++; //下一次放进辅助数组的新下标 } if (low > mid) //证明左区间已经放完 break;
while (hig <= right && arr[low] > arr[hig])//证明右区间没有合并完,且左区间的值大于右区间的值 { pData[index] = arr[hig]; //把右边的值放进辅助数组 hig++; //右边往高位移,下一次需要判断右边的新下标 index++; //下一次放进辅助数组的新下标 } }
//到这一步,证明起码有一个区间已经合并完成 if (hig <= right) //证明右边没有完成 memmove(&pData[index], &arr[hig], sizeof(int)* (right - hig + 1)); if (low <= mid) //证明左边没有完成 memmove(&pData[index], &arr[low], sizeof(int)* (mid - low + 1));
//把所有区间都合并到了辅助区间 memmove(&arr[left], pData, sizeof(int)* length); free(pData); //释放空间}


07
桶排序




桶排序是典型的空间换时间,在对整数排序中,没有什么算法能比它还快,但是在空间浪费上,它是祖宗。


示意图演示原理,外加代码实现桶排序:





C语言代码实现:

void radix_sort(int arr[], size_t len){ int**temp = (int **)malloc(sizeof(int) * 10); //10行 //申请动态内存 辅助数组temp[10][]; for (int i = 0; i < 10; i++) { temp[i] = (int *)malloc(sizeof(int)*len); }
for (int i = 1; i <= 100; i *= 10)//循环数值可能有的位数 { for (int x = 0; x < 10; ++x)//辅助数组行循环 { for (int y = 0; y < len; ++y)//辅助数组列循环 { temp[x][y] = -1;//辅助数组的初始化赋值,-1表示在arr里面不可能出现的数值 } } //arr数组中的元素放入辅助数组 for (int m = 0; m < len; ++m) { int index = (arr[m] / i) % 10; temp[index][m] = arr[m]; } //把辅助数组的内容放回待排序数组 int k = 0;//待排序的下标 for (int x = 0; x < 10; x++) { for (int y = 0; y < len; ++y) { if (temp[x][y] != -1) arr[k++] = temp[x][y]; } } } //释放内存 for (int i = 0; i < 10; i++) { free(temp[i]); } free(temp);}


算法复杂度





这个算法的复杂度纯理论,我就放到最后来讲


一个时间复杂度,一个空间复杂度

一个稳定,一个不稳定


稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面

不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面

时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律

空间复杂度 :是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

附录:








 



推荐阅读


【1】 100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色
【2】 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】 必读
【3】搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?
【4】鸿蒙系统HarmonyOS实现点亮LED
【5】Linux信号处理机制详解


本公众号全部原创干货已整理成一个目录,点击干货即可获得


后台回复进群」,即可加入技术交流群,进群福利:免费赠送Linux学习资料



一口Linux 写点代码,写点人生!
评论
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 83浏览
  • 车机导航有看没有懂?智能汽车语系在地化不可轻忽!随着智能汽车市场全球化的蓬勃发展,近年来不同国家地区的「Automotive Localization」(汽车在地化)布局成为兵家必争之地,同时也是车厂在各国当地市场非常关键的营销利器。汽车在地化过程中举足轻重的「汽车语系在地化」,则是透过智能汽车产品文字与服务内容的设计订制,以对应不同国家地区用户的使用习惯偏好,除了让当地车主更能清楚理解车辆功能,也能进一步提高品牌满意度。客户问题与难处某车厂客户预计在台湾市场推出新一代车款,却由于车机导航开发人
    百佳泰测试实验室 2025-01-09 17:47 30浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 99浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 103浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 115浏览
  • 职场是人生的重要战场,既是谋生之地,也是实现个人价值的平台。然而,有些思维方式却会悄无声息地拖住你的后腿,让你原地踏步甚至退步。今天,我们就来聊聊职场中最忌讳的五种思维方式,看看自己有没有中招。1. 固步自封的思维在职场中,最可怕的事情莫过于自满于现状,拒绝学习和改变。世界在不断变化,行业的趋势、技术的革新都在要求我们与时俱进。如果你总觉得自己的方法最优,或者害怕尝试新事物,那就很容易被淘汰。与其等待机会找上门,不如主动出击,保持学习和探索的心态。加入优思学院,可以帮助你快速提升自己,与行业前沿
    优思学院 2025-01-09 15:48 102浏览
  • 在当前人工智能(AI)与物联网(IoT)的快速发展趋势下,各行各业的数字转型与自动化进程正以惊人的速度持续进行。如今企业在设计与营运技术系统时所面临的挑战不仅是技术本身,更包含硬件设施、第三方软件及配件等复杂的外部因素。然而这些系统往往讲究更精密的设计与高稳定性,哪怕是任何一个小小的问题,都可能对整体业务运作造成严重影响。 POS应用环境与客户需求以本次分享的客户个案为例,该客户是一家全球领先的信息技术服务与数字解决方案提供商,遭遇到一个由他们所开发的POS机(Point of Sal
    百佳泰测试实验室 2025-01-09 17:35 115浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 100浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 87浏览
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 51浏览
  • HDMI 2.2 规格将至,开启视听新境界2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新HDMI规范为规模庞大的 HDMI 生态系统带来更多选择,为创建、分发和体验理想的终端用户效果提供更先进的解决方案。新技术为电视、电影和游戏工作室等内容制作商在当前和未来提供更高质量的选择,同时实现多种分发平台。96Gbps的更高带宽和新一代 HDMI 固定比率速率传输(Fixed Rate Link)技术为各种设备应用提供更优质的音频和视频。终端用户显示器能以最
    百佳泰测试实验室 2025-01-09 17:33 124浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 117浏览
  • 1月9日,在2025国际消费电子展览会(CES)期间,广和通发布集智能语音交互及翻译、4G/5G全球漫游、随身热点、智能娱乐、充电续航等功能于一体的AI Buddy(AI陪伴)产品及解决方案,创新AI智能终端新品类。AI Buddy是一款信用卡尺寸的掌中轻薄智能设备,为用户带来实时翻译、个性化AI语音交互助手、AI影像识别、多模型账户服务、漫游资费服务、快速入网注册等高品质体验。为丰富用户视觉、听觉的智能化体验,AI Buddy通过蓝牙、Wi-Fi可配套OWS耳机、智能眼镜、智能音箱、智能手环遥
    物吾悟小通 2025-01-09 18:21 38浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦