2022考研内排序算法总结

排序

排序与内排序算法

l  排序,若数据能在内存中完全装入,排序过程可以一次性地在内存中完成,则称之为内排序。通常,按照排序算法依据的基本原理,可以分为以下______类,包括:

A___________  B__________    C__________    D__________    E__________

其中____________不是基于比较的排序算法,____________是外排序常用思想。

       插入排序、交换排序、选择排序、基数排序、归并排序;基数排序;归并排序

l  插入排序的基本思想:

n  维持一个渐进递增的有序序列,每次都把一个新元素插入到原有序序列中,特点是维持了一个有序序列,但元素位置通常并非最终位置,依据这个朴素思想直接而来的便是简单插入排序,如果元素已经有序,那么对于每一个新元素,与有序序列的末尾元素比较一次,得知应插入到末尾元素的后面,此时不需要移动元素,因而在线性表已经有序时算法时间复杂度为O(n)。另外,简单选择排序是稳定的

n  依据这一特点,一种改进的算法称为希尔排序,又称缩小增量(K)排序,将原始数据每隔K个分一组,共K组,对这K小组组内使用简单选择排序,排好后数据“更加有序了些”(比较模糊的说法),然后K折半,分组再排,直到K=1,此时表基本有序,可以较快的完成整体排序。另外,希尔排序是不稳定的。

l  交换排序

n  通过交换使得某一个元素到达最终有序表中该元素对应位置

n  冒泡排序,通过相邻元素的交换使得小的元素“浮”到前面,具体做法是,维持一个指向有序序列最后一个元素的下一位指针p(初始时就是第一个元素),另外有一个遍历指针q从表尾开始向前遍历,终点是p的下一位,遍历时,每访问到一个元素,就把该元素与前一个相邻元素进行比较,若为逆序则交换,以升序为例,若该元素小于前一个相邻元素,则交换之。另外,可以设置一个FLAG,若某一趟未发生交换操作,则说明表已经有序,可以退出遍历。据此,若表已经有序,则对于设立FLAG的冒泡排序算法,其时间复杂度为O(n)。另外,冒泡排序是稳定的算法。

n  快速排序,核心思想是划分,通常以表首元素为枢轴,将表划分成两个部分,前一部分的所有元素小于枢轴,后半部分大于枢轴,此时,表首元素就位于全局有序的位置上,此后再对前半部分和后半部分进行快速排序,算法平均时间复杂度为O(n.log2n),最坏时间复杂度为O(n^2),这要求每一次划分都恰好一个部分没有元素而另一个部分含有除枢轴外的所有元素,这种情况发生在元素有序(无论顺序还是逆序)的情况下。另外,快速排序是不稳定的算法。

l  选择排序

n  选择一个最小(大)的元素附在有序表(初始为空)的后面,逐渐的扩大有序表的长度直到所有的元素都已收敛。基于这种思想直接而来的就是简单选择排序,以升序为例,具体选择过程是:第一轮,从第二个元素开始遍历,直到最后一个元素,遍历到某个元素时,将其与第一个元素比较,若比第一个元素小,则交换,这样第一轮结束,空的有序序列就变为含有一个元素的有序序列(全局),后面的轮次类推。2,2,1;第一轮:1,2,2…这说明简单选择排序不稳定,同时无论初始序列是否有序,其算法时间复杂度总是O(N^2)。

n  堆排序,利用堆这种数据结构,以一种巧妙地方式解决了排序问题,无论初始序列如何,其时间复杂度总为O(nlog2n)。给定一个序列,先建堆,再不断地输出堆顶元素并加以调整。以大根堆为例,根节点关键字总是大于其左右子树的关键字值,左子树、右子树也分别是大根堆。初始时,将序列看作完全二叉树,按照堆的定义将其自下而上的迭代调整,得到大根堆。此后,将堆顶元素与堆末尾元素交换,忽略被交换的堆顶元素调整成为大根堆,调整n-1次,得到有序序列。它是不稳定的排序算法。

l  基数排序

n  以三位数的十进制数为例,有十个队列,依次为0到9,需要做的事情是分配和收集,从低位开始,将数字依次放到0到9的队列,然后按照0到9的队列顺序将数字依次出队,收集得到第一轮序列,此后按照次低位、最高位完成分配与收集,最终得到有序序列。

l  归并排序

n  在内排序中常考的是二路归并,使用的是递归算法,先把序列二分,两部分分别使用二路归并排好序(递归),然后使用merge函数将这两个有序序列合并,基本情况是两个部分都至多只含1个元素。一般而言,当题目中涉及多种排序算法的比较考察时,对于归并排序的一趟、一轮次,应理解为对数组的每两个元素不重叠的进行一个归并,这就是一趟(毕竟实际实现的时候是递归,其它算法的一趟比较好理解,而二路归并的一趟更多的是从手动模拟的角度而言),它是稳定的排序算法。

posted @ 2021-10-14 21:54  无悔光阴  阅读(247)  评论(0)    收藏  举报