今天给大家介绍剩下的几种排序算法。
五、冒泡排序
冒泡排序思路比较简单:
将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;
(第一轮结束后,序列最后一个元素一定是当前序列的最大值;)
对序列当中剩下的n-1个元素再次执行步骤1。
对于长度为n的序列,一共需要执行n-1轮比较
(利用while循环可以减少执行次数)
*代码实现
六、快速排序
快速排序的基本思想:挖坑填数+分治法
从序列当中选择一个基准数(pivot)
在这里我们选择序列当中第一个数最为基准数
将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
重复步骤1.2,直到所有子集当中只有一个元素为止。
用伪代码描述如下:
1.i=L;j=R;将基准数挖出形成第一个坑a[i]。
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中
代码实现:
七、归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
归并排序其实要做两件事:
分解—-将序列每次折半拆分
合并—-将划分后的序列段两两排序合并
因此,归并排序实际上就是两个操作,拆分+合并
如何合并?
L[first…mid]为第一段,L[mid+1…last]为第二段,并且两端已经有序,现在我们要将两端合成达到L[first…last]并且也有序。
首先依次从第一段与第二段中取出元素比较,将较小的元素赋值给temp[]
重复执行上一步,当某一段赋值结束,则将另一段剩下的元素赋值给temp[]
此时将temp[]中的元素复制给L[],则得到的L[first…last]有序
如何分解?
在这里,我们采用递归的方法,首先将待排序列分成A,B两组;然后重复对A、B序列
分组;直到分组后组内只有一个元素,此时我们认为组内所有元素有序,则分组结束。
代码实现
八、基数排序
基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。
分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中
收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[]
对新形成的序列L[]重复执行分配和收集元素中的十位、百位…直到分配完该序列中的最高位,则排序结束
根据上述“基数排序”的展示,我们可以清楚的看到整个实现的过程
代码实现
从运行结果上来看,堆排序、归并排序、基数排序真的快。
对于快速排序迭代深度超过的问题,可以将考虑将快排通过非递归的方式进行实现。
大学生软件行业求职,蘑菇天堂让offer就在你身边!
工作多年,困惑加薪升职都跟你无关,跳来跳去越跳越没有方向,别担心,蘑菇天堂你身边的职业大管家!
蘑菇天堂——你身边专业职业提升大管家,提供规划求职解决方案,缩短职业探索期,提高个人职业收益!
-
(蘑菇官方客服)
赞赏