同学们好!本期C++课外内容将介绍几种排序算法的相关内容。仅给出算法的实现原理,不会涉及具体的代码实现。希望通过此篇推送,同学们能够对各种排序算法有初步的认识,并了解其优缺点。
01
插入排序
直接插入排序(Straight Insertion Sort)的算法思路是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,从而找到相应的位置并插入。在从后向前扫描过程中,需要反复把已排序的元素逐步向后挪位,为待插入的新元素提供插入空间。
最好情况:当待排序列为正序时,每趟操作只需进行一次比较和2次记录的移动。
最坏情况:当待排序列为逆序时,第i个记录要与前i-1个记录进行比较,每次比较就要对记录进行一次移动。
02
交换排序
冒泡排序(Bubble Sort)的算法思路是:通过对待排序元素中相邻元素间关键字的比较和交换,使得关键字最大的元素如气泡一样上升。
最好情况:当待排序列为正序时,算法只执行一趟,进行n-1次关键字的比较,不需要进行移动。
最坏情况:当待排序列为逆序时,每趟排序在无序序列中只有一个最大的记录被交换到最终的正确位置。
03
选择排序
简单选择排序(Simple Selection Sort)的算法思路是:第一趟从n个记录中选出关键字最小的记录与第一个记录交换;第二趟从第二个记录开始的n-1个记录中选出关键字最小的记录与第二个记录交换;直至整个序列按关键字排序。
无论待排序列的初始状态如何,其关键字的比较次数都相同,总比较次数为1/2n(n-1).
04
归并排序
二路归并排序(2-way Merge Sort)的算法思路是:将待排序的n个元素看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌊n/2⌋个长度为2或1的有序子序列;再两两归并,得到⌊n/4⌋个长度为4或小于4的有序子序列;再两两归并,直到得到一个长度为n的有序序列。
每趟归并操作都需要⌊n/(2h)⌋次归并,h为归并子序列的长度。
05
基数排序
基数排序的算法思路是:将关键字拆分成若干项,每一项都看作是一个新的关键字,则可以对单关键字的序列进行排序。
设置若干桶,因十进制数分别有数字:0,1,2,……9,所以设置十个桶,分别用B0、B1、B2、……B9进行标识。
排序分两步:
(1)分配:将右起第j位数字相同的数放入同一桶。比如数字为1者,则放入桶B1,其余类推。
(2)收集:按B0、B1、B2、……B9的顺序进行收集。
重复(1)(2)从最右位直到最左位共t次。(位数不够者,左边补0,如3看成03)
我们可以看到,实现同一个结果可以有不同的方法。我们需要根据不同方法的特点,选择合适的方法,从而正确、高效地解决问题。
编辑 | 牟育生
审核 | 李竞雯