分享好友 最新动态首页 最新动态分类 切换频道
快速排序,归并排序
2024-12-26 05:38

思路

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

代码

 

其中分为三种方法

1.hoare版本的快排

以左边或者右边作为基准值都可以,但是需要注意如果是左边做基准值则先从右边开始找小,再到左边找大。基本思路是,先执行一轮找到基准值的最终位置,假设最左边的值为基准值,当left小于right则进入循环,在循环中先在右边找小于基准值的值并记录下该值的下标,然后在左序列找比基准值大的值,交换这两个值的位置。注意在右边找小左边找大的时候可能会出现越界问题所以在这里需要做多一次判断left是否小于right,还有可能出现等于基准值的情况,当等于基准值时不做交换。当left和right相遇时,返回相遇下标,该下标将原序列分为两个区间,再递归对这两个区间进行新一轮的排序。结束条件则是当begin大于或者等于end时则说明该区间只剩一个元素则不需要继续递归进行排序。

2.挖坑法快排

假设基准值还是最左侧的值,并引入一个新的变量hole,第一次进入循环的hole=left,先在右边找小,将小的值放入hole的位置上,并将刚刚找到的小的位置设为新的hole,再进行左边找大,将大的值放在hole的位置上,并将此时找到大的位置设为新的hole如此循环。当left和right相遇时跳出循环,并将一开始记录的基准值放在最后的hole上,此时的hole就是基准值的最终位置。这是一轮循环找到一个最终位置,并返回最终的hole,以hole将原序列分为两个子序列递归继续排序。结束条件依然为当begin大于或等于end时结束递归。

3.前后指针快排

创建两个变量prev和cur,prev初始值为left,cur初始值为left+1,当cur小于right时则循环。cur的作用是再原序列中找出比基准值小的值然后与prev进行交换,cur的作用就是在原序列中探路,prev与cur之间就是比基准值大的值,循环交换prev和cur的值会将他们两个下标之间比基准值大的值翻滚式的向后移动,最终当cur大于right时,prev所处的位置则是基准值的最终位置,prev的下标将序列分为两个子序列,如此递归完成每一轮排序。

思路

利用栈先进后出的原则,将原序列区间压入栈中,先将end压入再将begin压入栈中。当栈不为空时,先将栈顶元素赋值给left,然后弹出栈顶元素,再将此时的栈顶元素赋值给right,然后再弹出栈顶元素。执行一轮快排找出当前区间基准值的最终位置,将原序列分为两个子序列,当两个子序列的区间满足条件时则压入栈中继续循环找出子序列区间基准值的最终位置。

代码(栈相关实现函数在前面的栈的实现总结中

 
 

1.快速排序整体的综合性能和使用场景都是比较好的

2.时间复杂度为O(N*logN)

3.空间复杂度为O(logN)

4.稳定性:不稳定性

基本思想

采用了分治法,将原序列的子序列通过比较两个序列的元素大小一一尾插,再将其拷贝回到允许列中。即先使子序列有序,再将每个子序列之间有序,最终将两个有序的子序列合成原序列。

递归实现归并排序

 

递归实现归并思想

需要传入原序列,begin,end(原序列区间,拷贝序列。先判断当前区间是否可以递归,当begin不等于end时则可以递归。先找出中间下标,将原序列拆分成两个子序列,并将两个子序列的区间作为递归的参数传入。当原序列经过递归拆分到最小区间时,也就是一组两个元素,对这两个元素继续创建两个区间并对这两个元素比较大小尾插至拷贝序列中,当有其中一组序列结束时,则跳出两个元素直接比较大小的循环,找出未结束的子序列尾插至拷贝序列中,再将拷贝序列拷贝回到原序列的该层递归的区间中。至此完成最深层次的递归函数的归并,返回上一层循环如此。

非递归实现归并排序

 

非递归实现归并排序思路

创建变量gap=1,gap代表此时归并数据一组中含有的元素个数,gap赋值为1是因为根据递归方式实现归并,是先从最深层次完成第一轮归并,逐层向上。当gap小于原序列元素个数时则进入循环,再创建一个循环,该循环的作用是将原序列拆分为每组含有gap个元素的子序列,并对第1组和第2组,第3组和第4组进行归并。(如下图过程

并创建归并两组,每组的区间并对两个区间之间的元素按顺序进行比较尾插到拷贝数组中。

注意 

1.这种方法可能会出现两组区间越界的问题,需要规避一些情况,当end1大于等于原序列元素个数(n)的情况或者begin2大于n的情况下无法实现两组归并则直接跳出循环,若是直接跳出循环则需要归并完一组拷贝一组数据。

2.当end2大于等于n时,需要将end2修正,end2=n-1。只需要归并到n-1的位置即可。同时也是需要归并完一组拷贝一组。

归并排序特性总结

1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决再磁盘中的外排问题。

2.时间复杂度:O(N*logN)

3.空间复杂度:O(N)

4.稳定性:稳定

思路

1.创建数组统计每个数据出现的次数,将数组的下标作为数据的值,在数组中该下标的值为该数据出现的次数

2.根据统计次数排序

代码

 

代码思路

创建两个变量记录原序列最大和最小值,创建新序列的大小为max-min+1,将新序列初始化。遍历原数组数据减去最小值则是该值对应新序列下标的相对映射,最后再将新序列的值和下标按顺序一一赋值到原序列中。

时间复杂度:O(N+range)

空间复杂度:O(range)

缺陷

1.依赖数据范围,适用于范围集中的数组。

2.只能用于整形。

当出现重复数据较多时可以利用此方法

思路

将等于key的值移动到中间,小于key的值放至左边,大于key的值放至右边。

 

代码思路

创建新变量cur,用于遍历数组并判断当前位置的值与key比较。当cur小于等于right时进入循环,有三种情况:1.a[cur]小于key值,交换a[left]和a[cur],left++,cur++,left可以加1是因为left是一定指向key值的;2.当a[cur]大于key值,交换a[right]和a[cur],right--,此时的cur不加1是因为不确定交换过来的a[right]是否小于key;3.当a[cur]等于key值时则cur加1。此处代码大致是将hoare版本的快排思想和快慢指针的快排思想结合,将key值翻滚式的往中间挪动。

最新文章
Python编程基础及应用答案,python编程基础课后答案
Python入门教程 非常详细(从小白到高级)(新版)PS:欢迎大家来学习本教程,如果有什么不会的欢迎留言,我将随时解答;如果有不足之处欢迎大家留言,同时我欢迎大家来喷不足之处并提出建议,以方
论坛发外链,流量高、效果佳!59
论坛外链作为一种有效且高性价比的外链建设方式,一直受到SEO工作者的青睐。通过在高权重、相关性强的论坛中发布外链,不仅可以为网站带来流量,更能提升网站在搜索引擎中的排名。那么,哪些论坛适合发布外链呢?如何高效进行论坛发外链?
泉州seo优化分析(泉州seo公司排名)
大家好,今天小编关注到一个比较有意思的话题,就是关于泉州seo优化分析的问题,于是小编就整理了2个相关介绍泉州seo优化分析的解答,让我们一起看看吧。电子商务未来发展怎么样?网站好好的,360突然不收录了?谢谢邀请!2018年,中国电子
小程序 数据可视化技术
数据可视化是将数据转化为图形化表达的一种技术,它能帮助用户更直观地理解数据。对于小程序开发者来说,掌握数据可视化技术显得尤为重要。下面将为您详细介绍实现小程序数据可视化的流程及代码示例。在开始之前,让我们先了解一下整个实现
【I100腾讯手机管家下载】三星I100腾讯手机管家16.1.19免费下载
腾讯手机管家专注手机骚扰拦截,动态守护手机安全,深度清理微信、QQ缓存,让手机体积减半,拒绝卡慢。---认真服务---【骚扰拦截】智能拦截骚扰电话,过滤诈骗垃圾短信【清理加速】清理加速能力升级,释放空间告别卡慢【微信清理】个性清理
揭秘地下黄播:靠社交引流,马甲随时换,变现靠套路
  因为之前的网约车事件,很多平台都倒了。一位负责招聘主播的中介告诉燃财经,不过,带色的直播我这有,日入千元不是问题。   此前6月份,有网友爆料称,一名自称网约车司机的男士在某直播平台进行直播,称在搭载女性乘客时借助药物对
手机rpg游戏推荐榜单前十名2022 好玩的rpg游戏排行榜
rpg游戏实际上就是角色扮演类游戏,为了满足rpg游戏爱好者的需要,小编特地为大家总结了一份手机rpg游戏推荐榜单前十名2022,在这些rpg手游当中,玩家可以扮演着另外一个全新的角色,在异世界开启无尽冒险体验多种新玩法。1、《伊洛纳》伊
亚马逊测评方式有哪些?
国内电商行业的发展日趋激烈,卖家想要脱颖而出非常困难,许多卖家选择入驻跨境电商平台开店, 跨境电商平台吸引了许多卖家入驻,最近很多朋友都在问我亚马逊平台怎么测评,今天南哥和大家介绍一下测评的方式以及怎么更安全的测评测评方式
安卓获取不到gpu名字
目录GPU技术支持-业务篇-显示异常问题排查前言概述排查思路基本状态确认个例or共性问题验证措施-对换验证中间层状态判断验证措施显卡配置状态验证措施常见问题排查无显示问题(黑屏)确认系统状态判断显卡状态确认EDID状态、确认显示接口状
相关文章
推荐文章
发表评论
0评