医疗器械网站怎么做,网站建设责任分解,沈阳妇科,创业网站建设政策前言
在上一篇文章#xff0c;我们学习了插入排序#xff0c;选择排序以及交换排序中的冒泡排序#xff0c;接下来我们继续学习交换排序、归并排序以及非比较排序。
1. 快速排序
快速排序是交换排序的一种#xff0c;它的基本思想#xff1a;任取待排序序列中的某元素作…前言
在上一篇文章我们学习了插入排序选择排序以及交换排序中的冒泡排序接下来我们继续学习交换排序、归并排序以及非比较排序。
1. 快速排序
快速排序是交换排序的一种它的基本思想任取待排序序列中的某元素作为基准值按照该基准值将集合分割为两个子序列左边的小于基准值右边的大于基准值如何左右子序列重复该过程知道所有元素都排列到对应位置每次排序后基准值所在的位置就是排好序后其所在的位置。
快速排序有四个版本其中三个通过递归实现一个通过非递归实现。
快速排序递归版本的框架 分析当leftright时肯定要停止因为区间[left,right]间没有数据当相等时也停止因为只有一个数据不用进行划分。
在继续划分的前提下找到基准值划分为两个区间[left,key-1],[key1,right]继续划分。
1.1 hoare版本的快速排序
思路
1.创建左右指针用来确定基准值。
2. 从右到左找比基准值小的数据从左到右找比基准值大的数据将左右指针进行交换。 代码分析
我们将最左边的数据设为基准值在leftright 的前提下进行从右找小从左找大的操作当找到后进行交换的操作交换的前提也是leftright交换完之后将leftright--。当遍历完数组后将基准值和right进行交换此时的right就是基准值。
left都right。
1.2 挖坑版
思路设置左右指针将最左边的位置设为坑位将其数据作为基准值临时保存从右到左找比基准值小的数据填入坑此时找到的位置为坑位再从左到右找大于基准值的数据找到了填入坑位形成新坑。直到左指针大于右指针。最后将坑填为基准值。 left都小于right。
1.3 lomuto版本
思路将最左边数据设置为基准值设置两个指针一个cur用于遍历数组找到小于基准值的就让prev指针然后将小与基准值的数据与prev位置的进行交换。最后将prev指针与基准值进行交换。 快速排序时间复杂度Onlogn。
空间复杂度Ologn
1.4 非递归版本
非递归版本实现需要借助数据结构栈
思路向栈中插入最左边和最右边的取出两个数据的下标通过之前实现的方法找这个区间的基准值找到基准值后如果此时基准值右边的endkey1或leftkey-1则这个区间里面还有数据则将[left,key-1],[key1,end]进行入栈操作再依次进行取两个元素出栈直到栈为空。 2. 归并排序
归并排序中的归并指的是递归和合并即通过递归将数据集合分为一个一个的单独数据然后通过合并数据依次将数据进行有序化。 分为一个一个数据可以通过上面的递归进行。但不同的是每个数据都要进行划分所以区间为[left,key][key1,right]。
合并的思路创建一个临时的数组tmp该数组大小为n填入数组的时候通过判断大小小的填入当一个数组遍历完之后剩下的依次填入tmp当最终填完后将tmp覆盖到原数组里面。 3.非比较排序——计数排序
思路遍历数组将每个数据出现的次数记录并找到最大值与最小值开辟最大值-最小值1个空间的临时数组并将其值全部变为0临时数组的下标就是数据的值而下标对应的数据就是出现次数。排序时遍历临时数组将下标输入原数组。
为了更好的应用于负数以及跨度较大的数据我们可以将临时数组的下标对应的值稍作修改例如遇到[100,102,101,101,105]这样的数据我们可以将临时数组下标为0的位置对应为100下标为1的位置对应为101以此类推。 特点计数排序在数据范围集中时效率很高但应用范围及场景很有限。
时间复杂度ONrange。
空间复杂度Orange。
稳定性稳定。
4. 排序算法的复杂度及稳定性
稳定性待排序序列中多个相同关键字在经过排序后的相对次序不变则称为稳定否则不稳定。 5. 源码
排序 · b3ee05e · 重邮阿江/c_study_experience - Gitee.com