排序
假设含n个记录的序列为
{R1,R2,…,Rn}
其对应的关键字序列为
{K1,K2,…,Kn}
这些关键字的排列方式有多种,其中至少有一种排列方式能使得关键字之间存在着这样一个关系:
Kp1 <= Kp2 <= … <= Kpn
按此关系将记录序列重新排列为
{Rp1,Rp2,…,Rpn}
即为有序记录,将这一过程称为排序。
排序方法的稳定性
若在一个记录序列中Ki == Kj,且在排序前的序列中Ri领先于Rj。若在排序后的序列中Ri仍领先于Rj,则称使用的排序方法是稳定的;若排序后的序列中可能使Rj领先于Ri,则称所用的排序方法是不稳定的。
排序方法分类
若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序;反之,待排序的记录数量很大,整个排序过程不能在内存中一次完成,需要借助外存才能实现,则称此类排序为外部排序。
内部排序方法
1.插入排序:将无序序列区中的记录向有序序列区中插入,使有序序列长度增加
2.交换排序:通过比较记录的关键字大小来决定是否交换记录,从而排定记录所在位置
3.归并排序:将两个小的有序记录序列合并成一个大的有序记录序列,逐步增加有序序列长度
4.选择排序:从无序序列区中选出关键字最小(升序排列)或最大(降序排列)的记录,并将它交换到有序序列区中指定位置的方法
5.计数排序:通过统计小于(升序排列)或大于(降序排列)待排序记录关键字的记录个数,从而决定待排序记录所在位置
插入排序
直接插入排序
基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的、记录数增加1的有序表。
折半插入排序
在直接插入排序的基础上,用折半查找定位记录待排序记录在已排序记录表中的位置。
2路插入排序
是对折半插入排序算法的一种改进,目的是减少排序过程中记录的移动次数。以第一个记录为界,将整个记录序列分成两部分进行处理。将不小于第一个记录的记录用折半插入的方法插入到左路的有序序列中;将小于第一个记录的记录用折半插入的方法插入到右路的有序序列中。可设两个指针final和first分别指示左路序列的最后一条记录位置和右路序列中第一条记录的位置。
表插入排序
改变查找过程中采用的存储结构。采用静态链表进行排序,并在排序完成之后一次性的调整各个记录相互之间的位置。
希尔排序
又称缩小增量排序。利用直接插入排序的优点对待排序的记录序列先做宏观调整,再做微观调整。将整个记录序列按下标的一定增量分成若干个子序列,对每个子序列分别进行直接插入排序。然后再将增量缩小,划分子序列,重复进行,最后再对整个序列进行一次直接插入排序。
交换排序
起泡排序
略
快速排序
又称霍尔排序,将序列中的每条记录当成一个标尺,凡是比该记录关键字小的记录移到该记录的前面,不小于的移到后面,这样就确定了该记录的位置,也称该记录为枢轴记录。
选择排序
简单选择排序
一趟简单选择排序的操作为:从无序的记录序列中选出一个关键字值最小的记录存入到指定的位置
树形选择排序
一种借助于锦标赛方式的选择排序算法。使用近似于完全二叉树的树形,所有记录均为叶子结点,从叶子结点开始,通过两两比较,填到树顶的结点是对应关键字最小的记录,然后将该叶子结点关键字置为最大关键字(或无穷大),继续选出第二个最小值,重复进行至排序结束。
堆排序
堆或者是空二叉树,或者是一颗满足如下特性的完全二叉树:其左右子树均是堆,并且当左子树或右子树不空时,根结点的值小于(或大于)左右子树根结点的值。
归并排序
递归的归并排序算法
1. 有序表合并算法
2.2路归并排序算法
非递归的归并排序算法
1.有序表合并算法
2.归并排序算法
计数排序
通过记录关键字的比较,计算每个记录应该存放的位序,也就是对每个记录,统计记录序列中按关键字值排在它前面的记录个数,然后把每个记录调到相应位置。
基数排序
一种多关键字的排序方法。假设有n个记录构成的序列{R1,R1,…,Rn},其中每个记录Ri中含有d个关键字(K01 , K11 … Kd-1 1)若对于序列中任意两个记录Ri和Rj都满足Ri中所有关键字对应小于Rj中的关键字。则称上述记录序列对关键字(K01 , K11 … Kd-1 1)有序。其中K0被称为最主位关键字,Kd-1被称为最次位关键字。
最高位优先(MSD)法
先按最主位关键字K0进行排序,并按K0的不同值将记录序列分成若干子序列,在分别按K1进行排序…以此类推,直到最后按最次位关键字Kd-1排序完成为止
最低位优先(LSD)法
先按最次位关键字Kd-1进行排序,并按K0的不同值将记录序列分成若干子序列,在分别按Kd-2进行排序…以此类推,直到最后按最主位关键字K0排序完成为止