数据结构常见的排序算法及解析下

今天给大家介绍剩下的几种排序算法。

五、冒泡排序

  冒泡排序思路比较简单:

  将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;

(第一轮结束后,序列最后一个元素一定是当前序列的最大值;)

  对序列当中剩下的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就在你身边!

工作多年,困惑加薪升职都跟你无关,跳来跳去越跳越没有方向,别担心,蘑菇天堂你身边的职业大管家!

蘑菇天堂——你身边专业职业提升大管家,提供规划求职解决方案,缩短职业探索期,提高个人职业收益!

-

(蘑菇官方客服)

赞赏

长按







































北京哪里治疗白癜风
治疗白癜风哪里好啊



转载请注明:http://www.92nongye.com/gaishu/204618536.html