数据结构排序PPT课件.ppt
《数据结构排序PPT课件.ppt》由会员分享,可在线阅读,更多相关《数据结构排序PPT课件.ppt(62页珍藏版)》请在三一文库上搜索。
1、第七章第七章 排序排序71 排序的基本概念72 插入排序73 交换排序74 选择排序75 归并排序*76 基数排序77 内排序方法的比较 71 排序的基本概念1排序对象 由记录序列组成的文件,每一个记录又由若干数据项组成。由于文件是记录的序列,所以从逻辑结构上看它是个线性表 表7.1 学生成绩表2排序排序码 通常把选作排序依据的数据项的值称为排序码。3排序的定义 将一组记录按照某个排序码非递增或非递减的次序重新排列的过程。一条记录一个数据项4排序的稳定性 排序码相同的两个记录经过排序之后,其相对次序保持不变,称该排序方法是稳定的;反之,称该排序方法是不稳定的。5内部排序与外部排序 整个排序过程
2、全部在内存中进行,这种排序称为内部排序。涉及内外存之间数据交换的排序称为外部排序。外部排序的速度比内部排序的速度要慢得多。6.排序两种基本操作:1)比较两个记录排序码的大小;2)将记录从一个位置移动到另一个位置。7.常见排序方法:插入排序、交换排序、选择排序、归并排序、基数排序8排序方法的评价 时间复杂度,空间复杂度、稳定性和简单性等 9记录序列采用顺序存储结构,其C语言描述如下:#define N 20typedef struct int key;/*定义排序码*/DataType other;/*定义其他数据项*/RecType;/*记录的类型*/RecType RN+1;N为待排序记录的
3、个数,R0不存放记录,原因有两个:其一,使数组的下标和记录的序号对应;其二,将R0留作他用,比如做监视哨或者做记录交换的辅助空间。72 插入排序插入排序插入排序(Insertion Sort)的基本思想是:将一个待排序记录按照排序码的大小插入到一个有序序列的适当位置,使得插入后的序列仍然有序,直到所有记录全部插入到有序序列中。插入排序主要包括两种方法:直接插入排序和希尔(Shell)排序。7 72 21 1 直接插入排序直接插入排序 直接插入排序的基本思想基本思想:待排序的n个记录存放在数组R1Rn中,把数组分成一个有序表和一个无序表,开始时有序表中只有一个记录R1,无序表中含有n-1个记录R
4、2Rn。在排序的过程中每一次从无序表中取出第一个记录,把它插入到有序表中的适当位置,使之成为新的有序表,这样经过n-1次插入后,无序表成为空表,有序表就包含了全部n个记录,排序完毕。将一个记录插入到有序表的过程称为一趟直接插入一趟直接插入排序。排序。举例:排序码初始序列为(举例:排序码初始序列为(7878,3838,3232,9797,7878,3030,2929,1717)R1 R2 R3 R4 R5 R6 R7 R8 78 38 32 97 78 30 29 17 (初始状态)38 78 32 97 78 30 29 17 (插入38后)32 38 78 97 78 30 29 17 (插
5、入32后)32 38 78 97 78 30 29 17 (插入97后)32 38 78 78 97 30 29 17 (插入78后)30 32 38 78 78 97 29 17 (插入30后)29 30 32 38 78 78 97 17 (插入29后)17 29 30 32 38 78 78 97 (插入17后)直接插入排序过程图示直接插入排序算法的C函数如下:void insertSort(RecType R)/*对数组R中的记录进行直接插入排序*/int i,j;for(i=2;i=N;i+)/*待插入记录为R2,RN*/R0=Ri;/*将待插入的记录Ri放入R0中*/j=i-1;w
6、hile(R0.keyRj.key)/*查找记录Ri应该插入的位置*/Rj+1=Rj-;/*将排序码大于Ri.key的记录后移*/Rj+1=R0;/*插入Ri*/直接插入排序算法的性能分析时间效率 最好情况下为O(n)最坏和平均时间复杂度都为O(n2)空间效率 O(1)稳定的排序方法7 72 22 2 希尔排序希尔排序 希尔排序的基本思想基本思想是:将待排序记录序列分成几个组,在每一组内分别进行直接插入排序,使得整个记录序列部分有序;重复此过程,直到所有记录都在同一组中,最后对所有的记录进行一次直接插入排序即可。如何分如何分组 将数组R1Rn的记录分为d个组,使下标距离为d的记录在同一组,即R
7、1,R1+d,R1+2d,.为第一组,R2,R2+d,R2+2d,.为第二组,以此类推,Rd,R2d,R3d,.为最后一组(第d组),这里的d叫做步步长(或增量增量值)。这种分组在每一组内做直接插入排序的时候,记录移动一次,能跨跃较大的距离,从而加快了排序的速度。希尔排序要对记录序列进行多次分组,每一次分组的步长d都在递减,即d1d2d3dt,直到最后一次选取步长dt=1,所有的记录都在一组中,进行最后一次直接插入排序,我们将每一次分组排序的过程称为一趟希一趟希尔排序排序。举例:设排序码初始序列:(36,25,48,65,12,25,43,57,76,32)R1 R2 R3 R4 R5 R6
8、R7 R8 R9 R10 36 25 48 65 12 25 43 57 76 32 (初始状态)36 25 (d1=5)25 43 48 57 65 76 12 32 25 25 48 65 12 36 43 57 76 32 (一趟希尔排序结果)25 65 43 32 (d2=3)25 12 57 48 36 7625 12 36 32 25 48 43 57 76 65 (二趟希尔排序结果)25 12 36 32 25 48 43 57 76 65 (d3=1)12 25 25 32 36 43 48 57 65 76 (三趟希尔排序结果)希尔排序过程图示一趟希尔排序算法的C函数:voi
9、d shellInsert(RecType R,int d)/*按步长d进行分组,每一组分别做直接插入排序*/int i,j;for(i=d+1;i0&Rj.keyR0.key)Rj+d=Rj;j=j-d;/*记录后移,查找插入位置*/Rj+d=R0;/*插入记录*/整个希尔排序算法的C函数:void shellSort(RecType R,int d,int t)/*d0dt-1为每一趟分组的步长*/int k;for(k=0;kt;k+)shellInsert(R,dk);希尔排序算法的性能分析当n较大时,希尔排序的平均时间复杂度在O(nlog 2n)和O(n2)之间,大约为O(n1.5)
10、算法的空间复杂度是O(1)。希尔排序是不稳定的。73 交换排序 交换排序的基本思想基本思想是:两两比较待排序记录的排序码,不符合排列顺序则交换记录,直到所有记录的排序码都符合排序要求。本节主要介绍两种交换排序:起泡排序和快速排序。7 73 31 1 起泡排序起泡排序 起泡排序的基本思想基本思想是:首先将记录R1的排序码与记录R2的排序码做比较(从上向下),若R1的排序码大于R2的排序码,则交换两个记录的位置,使排序码大的记录(重者)往下“沉”(移到下标大的位置),使排序码小的记录(轻者)往上“浮”(移到下标小的位置);然后比较R2和R3的排序码,同样轻者上浮,重者下沉;依此类推,直到比较Rn
11、1和Rn的排序码,若不符合顺序就交换位置,称此过程为一趟起泡排序一趟起泡排序,结果是R1Rn中排序码最大的记录沉“底”,即放入Rn中。接下来,在R1Rn-1中进行第二趟起泡排序,又会将一个排序码最大的记录沉“底”,放到Rn-1中。这样重复进行n-1趟排序后,对于n个记录的起泡排序就结束了,数组R1Rn成为有序表。举例:设有举例:设有8 8个记录的排序码初始序列为个记录的排序码初始序列为(3636,2525,4848,1212,2525,6565,4343,5757)R1 36 25 25 25 25 25 25 25R2 25 36 36 36 36 36 36 36R3 48 48 48
12、12 12 12 12 12R4 12 12 12 48 25 25 25 25R5 25 25 25 25 48 48 48 48R6 65 65 65 65 65 65 43 43R7 43 43 43 43 43 43 65 57R8 57 57 57 57 57 57 57 65一趟排序的过程图示R1 R 2 R 3 R4 R5 R6 R7 R 836 25 48 12 25 65 43 57 (初始状态)25 36 12 25 48 43 57 65 (1趟排序结果)25 12 25 36 43 48 57 65 (2趟排序结果)12 25 25 36 43 48 57 65 (3趟
13、排序结果)12 25 25 36 43 48 57 65 (4趟排序结果)12 25 25 36 43 48 57 65 (5趟排序结果)12 25 25 36 43 48 57 65 (6趟排序结果)12 25 25 36 43 48 57 65 (7趟排序结果)起泡排序的全过程图示起泡排序算法的C函数如下:void bubbleSort(RecType R)RecType x;int i,j,flag;for(i=1;iN;i+)/*i排序的趟数,n个记录最多进行n-1趟排序*/flag=1;/*flag表示每趟排序是否交换,比较之前置为1 ,表示无交换*/for(j=1;jRj+1.ke
14、y)x=Rj;Rj=Rj+1;Rj+1=x;flag=0;if(flag)break;/*若没有交换,表明已有序,结束循环*/起泡排序的性能分析时间效率:起泡排序的最好时间复杂度为O(n),最坏时间复杂度为O(n2),可以证明它的平均时间复杂度也为O(n2)。空间效率:在整个算法中,需要一个用于交换记录的辅助空间,所以起泡排序的空间复杂度为O(1)。稳定性:起泡排序是稳定的。7 73 32 2 快速排序快速排序快速排序快速排序(Quick Sort)也被称为划分排序或分区排序,它是目前所有的内部排序方法中速度最快的一种,快速排序是对起泡排序的一种改进。快速排序的基本思想基本思想是:在R1Rn中
15、任意选取一个记录作为“基准记录”,将整个数组划分为两个子区间:R1Ri-1和Ri+1Rn,前一个区间中记录的排序码都小于或等于基准记录的排序码,后一区间中记录的排序码都大于或等于基准记录的排序码,基准记录落在排序的最终位置Ri上,我们称该过程为一次划分(或一趟快速排序)。若R1Ri-1和Ri+1Rn非空,分别对每一个子区间再重复这样的划分,直到所有子区间为空或只剩下一个记录,使整个数组达到有序。举例:排序码初始序列为(49,14,38,74,96,65,8,49,55,27),对其进行快速排序。一次划分的详细操作过程为:(1)选取R1为基准记录,将其复制到R0中;(2)设置两个搜索“指针”并
16、赋初值为:low=1;high=10;(3)若lowhigh,从high位置向前搜索排序码小于R0.key的记录,如果找到,将Rhigh移动到Rlow位置,然后从low位置向后搜索排序码大于R0.key的记录,如果找到,将Rlow移动到Rhigh位置,重复上述操作,直到两个“指针”相遇,即low=high,找到了基准记录的最终排序位置low,由于这个位置的原值已经被移走,可以将R0赋值给Rlow,一次划分完毕。R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 49 49 14 38 74 96 65 8 49 55 27 14 38 74 96 65 8 49 55 27 l
17、ow=1 high=10从high向前搜索小于R0.key的记录,找到R10,将R10移到Rlow 27 14 38 74 96 65 8 49 55 low=1 high=10 从low向后搜索大于R0.key的记录,找到R4,将R4移到Rhigh 27 14 38 96 65 8 49 55 74 low=4 high=10 从high向前搜索小于R0.key的记录,找到R7,将R7移到Rlow 27 14 38 8 96 65 49 55 74 low=4 high=7 从low向后搜索大于R0.key的记录,找到R5,将R5移到Rhigh 27 14 38 8 65 96 49 55
18、74 low=5 high=7 从high向前搜索小于R0.key的记录,两指针相遇low=high 27 14 38 8 65 96 49 55 74 low high 一次划分结束,填入基准记录:Rlow=R0,此时数组分成前后两个子区间 27 14 38 8 49 65 96 49 55 74 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 49 14 38 74 96 65 8 49 55 27 初始状态 27 14 38 8 49 65 96 49 55 74 第一层划分结果 8 14 27 38 49 55 49 65 96 74第二层划分结果 8 14 27 38
19、49 49 55 65 74 96 第三层划分结果 快速排序全过程图示一次划分的C函数如下:int partition(RecType R,int low,int high)/*一趟快速排序*/int k;R0=Rlow;/*以子表的第一个记录作为基准记录*/k=Rlow.key;/*取基准记录排序码*/while(lowhigh)/*从表的两端交替地向中间扫描*/while(low=k)high-;if(lowhigh)/*比基准记录小的交换到前端*/Rlow=Rhigh;while(lowhigh)&(Rlow.key=k)low+;if(lowhigh)/*比基准记录大的交换到后端*/R
20、high=Rlow;Rlow=R0;/*基准记录到位*/return low;/*返回基准记录所在位置*/快速排序递归算法的C函数如下void QSort(RecType R,int low,int high)/*对数组R的子区间lowhigh做快速排序*/int part;if(lowhigh)part=partition(R,low,high);/*将表一分为二*/QSort(R,low,part-1);/*对前面的子区间快速排序*/QSort(R,part+1,high);/*对后面的子区间快速排序*/快速排序对应的二叉树起泡排序的性能分析时间效率:最好的情况下,时间复杂度为O(nlog
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 排序 PPT 课件
