排序 算法

本文介绍了多种经典的排序算法,包括冒泡排序、快速排序、简单选择排序等,并详细分析了每种算法的思想、实现思路及复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

冒泡排序(快速排序)、简单选择排序(堆排序)、直接插入排序(希尔算法)、归并排序,这几种排序都属于内排序

冒泡排序

1、思想
最简单冒泡排序:相邻的两个关键字两两相互比较,反序就交换位置,直到没有反序,看起来就像水中的气泡,从数组的最后一个关键字开始比较,较小的气泡慢慢地冒出水面(数组下标靠前),较大的数字留在下面
正宗冒泡排序:从最后两个关键字开始比较,将更小的数字向上作比较,直到找到更小的数,然后才移动位置,直到更小的数冒在上面,更大的数冒在下面,
2、算法实现思路
最简单冒泡排序:需要用到内外两次循环,外部第一次循环的时候找到最小的数字放入最小下标中,外部第二次循环放入数组第二个位置
3、复杂度分析
因为都需要用到内外两次循环,所以时间复杂度是O(n2)

快速排序:

1、思想
首先将 一个无序序列分割成两部分,其中一部分的关键字均比另一部分小,然后再对这两部分继续进行上述处理,最终得到有序的序列。
2、算法实现思路
该算法实现的关键在于选取正确的枢轴(将一部分序列一分为二的中间关键字)
3、复杂度分析
在时间复杂度分析中,最优的 情况为每次的枢轴选得恰到好处,使得无序序列最终按照类似于二叉排序数的方式分布成一个有序数组,因此时间复杂度为O(nlogn),最差情况下,以一种类似斜树来排,此时的比较次数为Σ(n-i)=1+2+3…+n-1+n-2,时间复杂度为O(n2),平均情况下时间复杂度仍然为nlogn.
空间复杂度分析:斜树的空间复杂度为O(n),最优情况下的空间复杂度为O(log2n),平均情况空间复杂度为O(logn)
不稳定的排序算法

简单选择排序

1、思想:不断进行位置交换而不是数组移动,最终完成排序。
2、算法实现思路
第一轮比较从所有的关键字中找出最小的那个,放在第一个位置(直接位置交换),第二轮比较找出后面数组中最小的那个,放在第二个位置。。。。。
3、复杂度分析
不管怎么样比较次数都是一样多的,移动次数为1+2+3……+n-2+n-1为O(n2),情况复杂时只会导致移动次数不同,但交换次数最多n-1,移动次数与比较次数相加整合在一起仍然是O(n2)

堆排序

1、思想
大(小)顶堆:首先是完全二叉树,然后每个节点的值比左右孩子都大于等于或小余等于
将一个无序序列构造成一个堆(大顶堆或者小顶堆),然后取出顶点上的值(要么是最大值,要么是最小值),将剩下的n-1个序列重新排成堆,得到次大值或者最小值,依次类推,最终得到一个有序的序列
2、复杂度分析
需要一定的辅助空间用于堆的创建
第i次取出堆顶元素后重新建堆的时间为logi,然后一共需要取n-1次堆顶元素,也需要重建堆n-1次,因此总的时间复杂度为O(nlogn),优于冒泡、简单选择、直接插入的时间复杂度

直接插入排序

1、思想
利用辅助空间,以空间换时间,将要比较的关键字插入到已排好的数组(辅助空间中的数组)中,先两个排到辅助数组中,然后插入第三个,依次类推
2、实现思路如上
3、复杂度分析
最坏情况下,数组是排好的逆序,这个时候比较次数为2+3+…+n-2+n-1,复杂度为O(n2),这时的移动次数为Σ(i+1)下标从2到n,时间复杂度为O(n2),但直接插入排序平均移动和比较的次数更小,因此性能比冒泡和简单排序更好

希尔排序

1、思想
希尔排序是在直接插入排序基础上更加高效的一种排序方式,该算法不断选取越来越小的增量将整个数组分成若干个小组,然后在每个小组中进行直接插入排序,再将这些小组合起来又重新进行增量分组,直到增量为1为止,此时所有的数字都被排成一个有序组了
2、复杂度分析
时间复杂度为O(n3/2),优于O(n2),但该算法不稳定

归并排序(分治算法)

1、思想
将长度为n的序列两两分割为[n/2]d个子序列,每个子序列排好序后两两归成个数减半、长度增倍的子序列,直到得到一个长度为n的有序序列为止
2、复杂度分析
首先需要长度为n的辅助空间记录原始序列,然后需要深度为log2n的栈空间,因此总的空间复杂度为O(n+logn);把这n个序列的归并排序过程看成一个完全二叉树,所以一共需要log2n次归并归并排序,然后就是每次归并时要比较扫描n次,因此一次归并排序的时间复杂度为O(n),故总的时间复杂度为O(nlogn)
归并顺序是一种稳定高效的排序算法,但是比较占用内存

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值