《大话数据结构》学习笔记 排序

 排序的严格定义:

 假设含有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.归并排序

你可能感兴趣的:(数据结构)