排序的严格定义:
假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字
满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序。
排序的稳定性;内排序与外排序(根据记录是否全部放置在内存中)。
根据排序中的主要操作,可以分为插入排序类(直接插入排序—>希尔排序),选择排序类(简单选择排序—>堆排序),交换排序类(冒泡排序—>快速排序),归并排序类(归并排序),后面依次是改进算法,前面被称为简单排序,后面可以称为复杂排序。
为学习排序设计的数据结构:
#define MAXSIZE 10 typedef struct{ int r[MAXSIZE+1]; //存取待排序数组,r[0]用作哨兵或临时变量 int length; //记录顺序表长度 }
常用的swap函数:
void swap(){
}
交换排序类
1.冒泡排序
2.快速排序
快速排序被称为20世纪十大算法之一。基本思想是:通过一趟记录将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,分别对这两部分记录进行排序,使整个序列有序。
插入排序类
1.直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
示例代码:
/*对顺序表L作直接插入排序*/ void InsertSort(SqList *L ){ int i,j; for(i=2;i<=L->length;i++){ if(L->r[i]<L->r[i-1]){ //将L->r[i]插入有序子表 L->r[0]=L->r[i]; // for(j=i-1;L->r[j]>L->r[0];j--){ L-r[j+1]=L->[0]; //记录后移 } L->r[j+1]=L->r[0]; //插入到正确位置 }} }
2.希尔排序
希尔排序是对直接插入排序的一种改进。
选择排序类
1.简单选择排序
2.堆排序
归并排序类
1.归并排序