各种排序整理详解 (2)

选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。

① 第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换
② 第二轮从下标为 2 到下标为 n-1 的元素中选取最小值,若小于第二个数,则交换
③ 依次类推下去……

性能分析

稳定性:不稳定
平均时间复杂度:O(N^2)
***时间复杂度:O(N^2)
最差时间复杂度:O(N^2)

模拟过程

各种排序整理详解

五.快速排序

有二分思想

选择A中的任意一个元素pivot(选哪个点都行,推荐选中间因为舒服,但个人喜欢坐着选),该元素作为基准

将小于基准的元素移到左边,大于基准的元素移到右边(分区操作)

A被pivot分为两部分L 和 R,继续对L和R做同样的处理

直到所有子集元素不再需要进行上述步骤

性能分析

稳定性:不稳定
平均时间复杂度:O(NlogN)
***时间复杂度:O(NlogN)
最差时间复杂度:O(N^2)

模拟过程

各种排序整理详解

各种排序整理详解

六.归并排序

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

分解(Divide):将n个元素分成个含n/2个元素的子序列。

解决(Conquer):用合并排序法对两个子序列递归的排序。

合并(Combine):合并两个已排序的子序列已得到排序结果。

1.递归分解,将数组分解成left和right。如果这两个数组内部数据是无序的,则对数组进行二分,直至分解出的小组只有一个元素,此时认为该小组内部有序。
2.合并两个有序数组,比较两个数组的最前面的数,谁小就先取谁,该数组的指针往后移一位。
3.重复步骤2,直至一个数组为空。
4.最后把另一个数组的剩余部分复制过来即可。

性能分析

稳定性:稳定
平均时间复杂度:O(NlogN)
***时间复杂度:O(N)
最差时间复杂度:O(NlogN)

模拟过程

各种排序整理详解

七.堆排序

虽然STL大法好,但是还是要写一下的(兢兢业业的博主不多了)
1.将数据存起来建一个大根堆
2.将堆顶与末尾交换,并输出(相当于不要了),再用剩下的点建一个大根堆
3.直至变成小根堆为止

性能分析

稳定性:不稳定
平均时间复杂度:O(nlogn)
***时间复杂度:O(nlogn)
最差时间复杂度:O(nlogn)

Why not 模拟过程?

because it is too easy to see(mainly is that I can\'t insert mp4)

But I can give a website
模拟过程

八.计数排序

计数排序(Counting sort)是一种稳定的线性时间排序算法。

注意:不是桶排序

① 分配。扫描一遍原始数组,以数值作为下标,将该下标的计数器增1。
② 收集。扫描一遍计数器数组,按顺序把值收集起来。

性能分析

稳定性:稳定
平均时间复杂度:O(n + k)
***时间复杂度:O(n + k)
最差时间复杂度:O(n + k)
空间复杂度:O(n + k)

模拟过程

各种排序整理详解

九.桶排序

一句话总结:划分多个范围相同的区间,每个子区间自排序,最后合并。

桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。

桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。

性能分析

稳定性:稳定
平均时间复杂度:O(n + k)
***时间复杂度:O(n + k)
最差时间复杂度:O(n ^ 2)
空间复杂度:O(n * k)

模拟无过程,只有图(嘻!)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgxjzf.html