内部排序
排序是计算机程序设计中的一项重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列
1
、插入排序
直接插入排序:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表
折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序
表插入排序:
#define SIZE 100 //静态链表容量
typedef struct{
RcdType rc;
//记录项
int next;
//指针项
}SLNode;
//表结点类型
typedef struct{
SLNode r[size] //0号单元为表头结点
int length;
//链表当前长度
}SLinkListType;
以上述说明的静态链表类型作为待排记录序列的存储结构,为了插入方便起见,设数组中下标为“0”的分量为表头结点,并令表头结点记录的关键字取最大证书MAXINT。
表插入排序的过程描述如下:首先将静态链表中数组下标为“1”的分量和表头结点构成一个循环链表,然后依次将下标为“2”至“n”的分量按记录关键字非递减有序插入到循环链表中
希尔排序:先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序
2
、交换排序
起泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个个记录和第n个记录进行过比较为止。上述过程称作第一趟起泡排序,其结果是使得关键字最大的纪录被安置到最后一个记录的位置上。然后进行第二趟气派排序,对前n-1个记录进行同样的操作,其结果是使关键字次大的纪录被安置到n-1个记录的位置上。整个排序过程需进行k(1<k<n)趟起泡排序,判别起泡排序结束的条件是“在一趟排序过程中没有进行过交换记录的操作”
快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序
3
、选择排序
每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录
每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录
简单选择排序:一趟简单排序的操作,通过n-i次关键字间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i个记录交换之。令i从1至n-1,进行n-1趟选择操作
堆排序:若序列为堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值,在输出堆顶的最小值之后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值。如此反复执行,便能得到一个有序序列,这个过程称之为堆排序。实现堆排序需要解决的两个问题:(1)如何由一个无序序列建成一个堆(2)如何在输出堆顶元素之后,调整剩余元素成为一个堆
4
、归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个有序的子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止
5
、基数排序
基数排序是一种借助多关键字排序的思想对单关键字进行排序的方法,基数排序是借助“分配”和“收集”这两种操作对单逻辑关键字进行排序的一种内部排序方法