数据结构排序算法稳定性总结——写给自己看

一、排序分类

(1)插入类:直接插入排序、折半插入排序、希尔排序

(2)交换类:冒泡排序、快速排序

(3)选择类:简单选择排序、堆排序(属于树形选择排序)

(4)归并类:2-路归并排序

(5)分配类:基数排序

 

二、排序稳定性及其原因

(1)稳定排序:直接插入排序、折半插入排序、冒泡排序、2-路归并排序、基数排序

  • 直接插入排序:每次将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上。在数组内部前半部为排好序的记录,后半部是未排好序的。比较时从前半部后向前比较,所以不会改变相等记录的相对位置。
  • 折半插入排序:将直接插入排序关键字比较时的查找利用“折半查找”来实现,本质并没有改变还是一种稳定排序。
  • 冒泡排序:通过两两比较相邻记录的关键字,如果发生逆序,则进行交换。也不会改变相等记录的相对位置。
  • 2-路归并排序:将两个有序表合并成一个有序表。每次划分的两个子序列前后相邻。合并时每次比较两个有序子序列当前较小的一个关键字,将其放入排好序的序列尾部。因为两子序列相邻,合并时也没有改变相等记录的相对位置,所以也是稳定的。
  • 基数排序:对待排序序列进行若干趟“分配”和“收集”来实现排序。分配时相等记录被分配在一块,没有改变相对位置,是一种稳定排序。

(2)不稳定排序:希尔排序、快速排序、堆排序

  • 希尔排序:采用分组插入的方法,将待排序列分割成几组,从而减少直接插入排序的数据量,对每组分别进行直接插入排序,然后增加数据量,重新分组。经过几次分组排序之后,对全体记录进行一次直接插入排序。但是希尔对记录的分组,不是简单的“逐段分割”,而是将相隔每个“增量”的记录分成一组(假如:有1~10十个数,以2为增量则分为13579、246810两组)。这种跳跃式的移动导致该排序方法是不稳定的。
  • 快速排序:改进的冒泡排序。冒泡只比较相邻的两个记录,每次交换只能消除一个逆序。快排就是通过交换两个不相邻的记录,达到一次消除多个逆序。正是这个非顺次移动导致该排序方法是不稳定的。
  • 堆排序:将待排序的记录r[1..n]看出是一颗完全二叉树的顺序存储结构,利用完全二叉树双亲节点孩子节点之间的内在关系,选择出最大(最小)的记录。因为双亲和孩子节点在数组中的位置不是顺次的,调整堆时是非顺次移动,所以该排序也是不稳定的。

(3)不确定是否稳定的排序:简单选择排序

  • 简单选择排序:每次从未排序的记录中选择最小的关键字,将其放到排好序的记录尾部。就该排序方法本身来讲,它是一种稳定排序。但是如果实现时采用“交换记录”的策略,就会产生不稳定现象,所以是否稳定取决于该算法采用的策略。
posted @ 2019-04-21 10:09  魏亚林  阅读(2837)  评论(0编辑  收藏  举报