【软考】【数据结构与算法】排序

1.概念

  稳定与不稳定排序:21 , 32 , 13 , 45 , 21 。黑色21与红色21的键值相同,排序完成后,黑色21仍然在红色21之前,则该排序为稳定排序,红色21有可能在黑色21之前,则该排序为不稳定排序。比如一次考试中出现了相同的分数,但这些分数是不同的人的成绩,则应该用稳定排序会更好。
  内排序与外排序:内排序是在内存中进行的排序,外排序是在外部存储中进行的排序
  排序的方法分类

  • 插入类排序:直接插入排序、希尔排序
  • 交换类排序:冒泡排序、快速排序
  • 选择类排序:简单选择排序、堆排序
  • 归并排序
  • 基数排序

     排序算法的性能
    这里写图片描述

2.插入排序

  直接插入排序:优点简单明了,缺点速度很慢。
这里写图片描述
  希尔排序:实质是一种分组进行直接插入排序法。效率比直接插入排序高。
这里写图片描述
  例如有10个数需要排序,第一次取d1 = 5 ,即每隔5个数分为1组。先对每组进行组内直接插入排序。第二次取d2 = d1/2,如果带小数则取接近小数的奇数,再进行组内直接插入排序,直至dt = 1 ,进行最后一次直接插入排序。

3.选择排序

  直接选择排序:每次选择最小的数依次与第一个、第二个……数交换。
这里写图片描述
  堆排序:先建立堆,依次取走堆顶的元素,再将剩余的元素重新组成新的堆,再取走堆顶元素,直至排序完成。
这里写图片描述
  形状类似于完全二叉树,其定义转换为二叉树树的说法为: 所有的孩子结点都比自身大,则为小顶堆;所有的孩子结点都比自身小,则为大顶堆。
  初建堆
  数组 A = {1,3,4,5,7,2,6,8,0} ,其初建堆的过程如下:
这里写图片描述
  按照完全二叉树的规则,顺次填入数组中的元素,从最后一个非叶子结点开始调整。如果建立大顶堆,则判断非叶子结点是否大于其孩子结点;如果建立小顶堆,则判断非叶子结点是否小于其孩子结点。并根据大顶堆还是小顶堆调整非叶子结点的位置。
  若我们对A进行初建大顶堆:
  图1.1:从最后一个非叶子结点5开始调整,5小于其孩子结点8,则交换5跟8的位置
  图1.2:倒数第二个非叶子结点为4 ,4小于其孩子结点6,交换4跟6的位置
  图1.3:下一个非叶子结点为3,需要进行多级调整,首先3小于其孩子结点8和7,可以任选一个进行交换,我们选择3和8进行交换,此时还需再对3,5,0的小数进行再次调整(图1.4)
  图1.5:调整完所有的非叶子结点后开始调整根节点,也需要进行多级调整。如图1.6,图1.7。调整后完成初建堆的过程。
  重组堆:将堆顶元素取走后如何重新组建新的堆
  例题,R{80,60,16,50,45,10,15,30,40,20}
这里写图片描述
  将堆顶元素80取走后,选择最后的结点20,放在堆顶,再对根节点进行初建堆的过程,即对根节点20进行多级调整。多级调整过程:20小于其孩子结点60,交换20与60的位置,20小于其孩子结点45与50,交换20与45的位置或交换20与50的位置(会得到不同的堆,但对最后结果没有影响),图中是交换20与50的位置,20小于其孩子结点30与40的位置,交换20与30的位置或交换20与40的位置。完成对堆的重组。

4.交换排序

  冒泡排序
  基本思想是:通过相邻元素之间的比较和交换,将较小的元素逐渐从底部移向顶部。排序过程中应注意下标的变化。
这里写图片描述

5.快速排序

  快速排序采用分治法,其基本思想是将原问题分解成若干个规模更小但结构域原问题相似的子问题,通过递归地解决这些子问题,然后再将这些子问题的解组合成原问题的解。步骤如下:
  第一步:待排序的n个记录中任取一个记录,以该记录为基准,将所有记录分为两组,第一组都小于基准,第二组都大于基准。
  第二部:采用相同的方法对左右两组进行排序,直到所有记录完成排序。
这里写图片描述

6.归并排序

  归并也称为合并,其基本思想是将两个或两个以上的有序子表合并成一个新的有序表。若将两个有序表合并成一个有序表,则称为二路合并。
  合并的过程是:比较A[i]和A[j]的排序码大小,若A[i]的排序码小于等于A[j]的排序码,则将第一个有序表中的A[i]复制到R[k]中, 并令i和k分别自加一。如此循环进行,直至其中一个有序表比较和复制完,然后再讲另一个有序表的剩余元素复制到R中。
这里写图片描述

7.基数排序

  基本思想是借助多关键字排序思想对单逻辑关键字进行排序的方法。基数的选择和关键字分解是根据关键字的类型来决定的。例如关键字是十进制数,则可以按个位、十位进行分解。先排个位,再排十位,最后排百位,如下图所示。
这里写图片描述