各种经典排序算法.ppt
《各种经典排序算法.ppt》由会员分享,可在线阅读,更多相关《各种经典排序算法.ppt(105页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、排排 序序本节基本内容与要求本节基本内容与要求o基本内容基本内容n顺序查找、二分查找、二叉树查找以及散列表上查找顺序查找、二分查找、二叉树查找以及散列表上查找 及算法思想及算法思想n排序的基本概念以及选择、插入、交换和归并四类排排序的基本概念以及选择、插入、交换和归并四类排序的基本思想和算法序的基本思想和算法o要求要求n掌握线性表、树和散列表掌握线性表、树和散列表(或称哈希表或称哈希表)的查找方法及的查找方法及算法实现以及各种查找方法的应用算法实现以及各种查找方法的应用n熟练掌握选择、插入、交换和归并四类排序的基本思熟练掌握选择、插入、交换和归并四类排序的基本思想和算法想和算法排排 序序1.4
2、 内部排序内部排序一、基本概念一、基本概念二、插入排序二、插入排序三、交换排序三、交换排序四、选择排序四、选择排序五、归并排序五、归并排序排排 序序一、基本概念一、基本概念1.排序的功能排序的功能:将一个数据元素(或记录):将一个数据元素(或记录)的的任意序列任意序列,重新排成一个按关键字,重新排成一个按关键字有序有序的序列。的序列。例如例如:下列是一组记录对应的关键字序列下列是一组记录对应的关键字序列(52,49,80,36,14,58,61,23,97,75)调整为调整为(14,23,36,49,52,58,61,75,80,97)排排 序序2.排序的定义排序的定义假设含假设含n个记录的序
3、列为个记录的序列为 R1,R2,,Rn 其相应的关键字序列为其相应的关键字序列为 K1,K2,,Kn 这些关键字相互之间可以进行比较,即在这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系它们之间存在着这样一个关系:Kp1Kp2Kpn按此固有关系将上式记录序列重新排列为按此固有关系将上式记录序列重新排列为 Rp1,Rp2,,Rpn 的操作称作的操作称作排序排序。排排 序序3、排序的基本操作、排序的基本操作o排序的概念:排序的概念:就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。o排序过程的组成步骤排序过程的组成步骤:首先比较两个关键字的大小;然后将记录从一个位置移动
4、到另一个位置。n对记录的关键字大小进行比较n将记录从一个位置移动到另一个位置o当待排序记录的关键字均不相同时,则排序结果是唯一的,否则排序的结果不一定唯一。排排 序序4、排序的稳定性、排序的稳定性若有:若有:R1,.,Ri,.,Rj,.且关键字:且关键字:Ki=Kj ij排序后:排序后:Ri,Rj,.则称该排序结果具有稳定性。则称该排序结果具有稳定性。在待排序的文件中,若存在在待排序的文件中,若存在多个关键字相同的记录,经多个关键字相同的记录,经过排序后这些具有相同关键过排序后这些具有相同关键字的记录之间的字的记录之间的相对次序相对次序保保持持不变不变,该排序方法是,该排序方法是稳定稳定的;的
5、;若具有相同关键字的记录之若具有相同关键字的记录之间的间的相对次序相对次序发生发生变化变化,则,则称这种排序方法是称这种排序方法是不稳定不稳定的。的。排排 序序o内部排序内部排序:是指在排序的整个过程中,:是指在排序的整个过程中,数据数据全部存放全部存放在计算机的在计算机的内存内存储器里,并且在内存储器里调整数据储器里,并且在内存储器里调整数据的位置;的位置;o当文件很大以致内存不足以存放全部数据时,在排序当文件很大以致内存不足以存放全部数据时,在排序过程中需要对过程中需要对外存外存进行存取访问,称这种借助于外存进行存取访问,称这种借助于外存储器进行排序的方法为储器进行排序的方法为外部排序外部
6、排序。o注意:注意:n 内排序适用于记录个数不很多的小文件内排序适用于记录个数不很多的小文件n 外排序则适用于记录个数太多,不能一次将其外排序则适用于记录个数太多,不能一次将其全部记录放入内存的大文件。全部记录放入内存的大文件。5、排序的分类、排序的分类排排 序序 o每次将一个待排序的记录,按其关键字大小插入到前面每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入已经排好序的子文件中的适当位置,直到全部记录插入完成为止。完成为止。o把新元素(未排序的元素的关键字)逐个插入正在增长把新元素(未排序的元素的关键字)逐个插入正在增长的顺序表中。的顺序表中
7、。o寻找插入位置的方法寻找插入位置的方法:n线性插入排序线性插入排序n对半插入排序对半插入排序n希尔排序希尔排序二、插入排序二、插入排序排排 序序有序序列L.r1.i-1L.ri无序序列 L.ri.n有序序列L.r1.i无序序列 L.ri+1.n1、线性插入排序、线性插入排序o基本思想:基本思想:每步将一个待排序的元素按其大小插入到前每步将一个待排序的元素按其大小插入到前面已排序的数据中的适当位置。面已排序的数据中的适当位置。重复该工作,直至有序重复该工作,直至有序区包含所有元素。区包含所有元素。排排 序序方法方法:o具体方法具体方法:先将第一个数据看成是一个有序的子序列,:先将第一个数据看成
8、是一个有序的子序列,然后从第然后从第2个数据起逐个插入到这个有序的子序列中去,个数据起逐个插入到这个有序的子序列中去,相应的元素要移动。相应的元素要移动。3将将L.ri 插入插入到到L.rj+1的位置上。的位置上。2将将L.rj+1.i-1中的所有中的所有记录记录均均后移后移 一个位置;一个位置;1在在L.r1.i-1中中查找查找L.ri的插入位置,的插入位置,L.r1.j L.ri L.rj+1.i-1;排排 序序该该算算法法适适合合于于n n 较较小小的的情情况况,时时间间复复杂度为杂度为O(nO(n2 2).).待排元素序列:待排元素序列:5353 27 36 15 69 42 27 3
9、6 15 69 42第一次排序:第一次排序:27 5327 53 36 15 69 42 36 15 69 42第二次排序:第二次排序:27 36 5327 36 53 15 69 42 15 69 42第三次排序:第三次排序:15 27 36 5315 27 36 53 69 42 69 42第四次排序:第四次排序:15 27 36 53 6915 27 36 53 69 42 42第五次排序:第五次排序:15 27 36 42 53 6915 27 36 42 53 69 线性插入排序示例线性插入排序示例对于有对于有n n个数个数据元素的待排据元素的待排序列,插入操序列,插入操作要进行作要
10、进行n-1n-1次次例:例:排排 序序void insertSort(RedType L,int n)int i,j;for(i=2;i=n;i+)L0=Li;/作为监视哨 for(j=i-1;L0.keyLj.key;j)Lj+1=Lj;/记录后移 Lj+1=L0;/插入 插入算法插入算法o方法:Ki与Ki-1,K i-2,K1依次比较,直到找到应插入的位置。排排 序序哨兵哨兵(监视哨监视哨)o哨兵(监视哨)有两个作用n作为临时变量存放Ri(当前要进行比较的关键字)的副本;n在查找循环中用来监视下标变量j是否越界。R0 R1 R2 R3 R4 R5 6 206157315 62015737
11、6152073367152033671520直接插入排序的程序:直接插入排序的程序:#include stdio.h#define n 5 int arn;int c,t;void d_insort(a)int an;int i,j;for(i=2;i0)&(taj)aj+1=aj;j=j-1;aj+1=t;main()int i;printf(请输入数据请输入数据:);for(i=1;i=n;i+)scanf(%d,&ari);d_insort(ar);printf(排序后的序列排序后的序列:);for(i=1;i=n;i+)printf(%d|,ari);printf(n);运行结果:运行
12、结果:请输入数据请输入数据:50 60 20 40 80排序后的序列排序后的序列:20|40|50|60|80|排排 序序性能分析性能分析最好情况(原始记录按关键字有序排列):最好情况(原始记录按关键字有序排列):O(n)“比较”的次数:最坏情况(原始记录按关键字逆序排列):最坏情况(原始记录按关键字逆序排列):O(n2)“比较”的次数:0“移动”的次数:“移动”的次数:结论:适用原始数据基本有序或数据量不大的情况。排排 序序 希尔排序(希尔排序(Shells method)又称为)又称为“缩小增量排序缩小增量排序”,本质上讲是插入排序,它是对线性插入排序的改进。本质上讲是插入排序,它是对线性
13、插入排序的改进。其基本思想是:其基本思想是:先取一个小于先取一个小于n的整数的整数d1并作为第一个增量,并作为第一个增量,将文件将文件的全部记录分成的全部记录分成d1个组,所有距离为个组,所有距离为d1倍数的记录放在同倍数的记录放在同一个组中,在各组内进行直接插入排序;一个组中,在各组内进行直接插入排序;然后取第二个增量然后取第二个增量d2d1,重复上述的分组和排序,重复上述的分组和排序,直至所取的增量直至所取的增量dt=1(dtdt 1d2d1)为止,此时,为止,此时,所有的记录放在同一组中进行直接插入排序。所有的记录放在同一组中进行直接插入排序。2 2 希尔插入排序希尔插入排序算法思想算法
14、思想排排 序序o如何选择增量序列才能产生最好的排序效果,这个问题如何选择增量序列才能产生最好的排序效果,这个问题至今没有得到解决。至今没有得到解决。o希尔本人最初提出取希尔本人最初提出取nd1=d1=n/2n/2,ndi+1=di+1=di/2di/2,ndt=1dt=1,t=t=log2nlog2n。排排 序序希尔插入排序希尔插入排序步骤步骤(1 1)首先选取一个整数)首先选取一个整数d d11n n(n n为待排序数据的个数),为待排序数据的个数),作为两个数据之间的作为两个数据之间的距离距离,这样把全部数据分成,这样把全部数据分成d d1 1个组,个组,凡是距离为凡是距离为d d1 1的
15、数据放在一个组里,在各组内进行内部的数据放在一个组里,在各组内进行内部排序,直到各组排好序为止。排序,直到各组排好序为止。(2 2)从上述的结果序列出发,再选择)从上述的结果序列出发,再选择d d22d d1 1,重复上面的,重复上面的分组与排序工作。分组与排序工作。(3 3)依次取)依次取didi+1+1didi,直到,直到dmdm=1=1(设一共需要(设一共需要m m次分组),次分组),即所有数据放在一组中排序为止。此时,全部数据便按即所有数据放在一组中排序为止。此时,全部数据便按次序排好了。次序排好了。设待排序共有设待排序共有10个记录,其关键字分别为个记录,其关键字分别为47,33,6
16、1,82,71,11,25,47,57,02,增量序列取值依次为,增量序列取值依次为5,3,1。希尔插入排序希尔插入排序过程过程 排排 序序 希尔排序实质上还是一种插入排序,其主要特点是:希尔排序实质上还是一种插入排序,其主要特点是:每一趟以不同的增量进行排序。每一趟以不同的增量进行排序。在每趟的插入排序中,记录在每趟的插入排序中,记录的关键字是和同一组中的前一个关键字进行比较,所以关键的关键字是和同一组中的前一个关键字进行比较,所以关键字较小的记录在排序过程中是作跳跃式的移动。字较小的记录在排序过程中是作跳跃式的移动。另外,另外,由于开始时增量的取值较大,每组中记录较少,由于开始时增量的取值
17、较大,每组中记录较少,故排序比较快,故排序比较快,随着增量值的逐步变小,每组中的记录逐渐随着增量值的逐步变小,每组中的记录逐渐变多,但由于此时记录已基本有序了,因次在进行最后一趟变多,但由于此时记录已基本有序了,因次在进行最后一趟增量为增量为1的插入排序时,只需作少量的比较和移动便可完成的插入排序时,只需作少量的比较和移动便可完成排序,从而提高了排序速度。排序,从而提高了排序速度。希尔插入排序希尔插入排序特点特点 排排 序序 希尔排序比直接插入排序的平均性能要好:希尔排序比直接插入排序的平均性能要好:l在在最好情况最好情况(原始记录按关键字有序排列)下,(原始记录按关键字有序排列)下,移动次数
18、为移动次数为0,比较次数界于,比较次数界于n n2 之间。之间。l在在最坏情况最坏情况(原始记录按关键字逆序排列)下,(原始记录按关键字逆序排列)下,移动次数和比较次数接近移动次数和比较次数接近n2。l在在平均情况平均情况下下,移动次数和比较次数在移动次数和比较次数在O(n1.3)左右,好于直接插入排序。左右,好于直接插入排序。希尔插入排序希尔插入排序性能效率性能效率排排 序序例例1.19 希尔排序的程序希尔排序的程序#include stdio.h#define max 10 int datamax+1;int indexmax+1;int i;排排 序序 void shell_sort(a
19、)int amax+1;int i,j,n,m,skip;int alldone;for(i=1;i1)skip=skip/2;do alldone=1;for(j=1;j=max-skip;j+)i=j+skip;n=indexi;m=indexj;if(anam)indexi=m;indexj=n;alldone=0;while(alldone=0);排排 序序main()printf(请输入数据请输入数据:);for(i=1;i=max;i+)scanf(%d,&datai);printf(n);for(i=1;i=max;i+)printf(%d ,datai);printf(n);s
20、hell_sort(data);for(i=1;ilength;i1;-i)for(j=1;jrj+1rj)Swap(L-rj,L-rj+1);时间性能分析:时间性能分析:比较次数比较次数:最坏最坏(n-1)+(n-2)+.+1;最好:最好:n-1 移动次数移动次数:最坏:最坏:3(n-1)+(n-2)+.+1);最好:;最好:0 7.3.1 冒泡排序冒泡排序算法和性能分析算法和性能分析排排 序序25531579 89i=7i=6for(j=1;j rj+1 rj)13i=27.3.1 冒泡排序冒泡排序改进改进排排 序序void BubbleSort(SqList *L)i=L-length;
21、while(i1)/定位第定位第i个位置的记录个位置的记录 lastExchangeIndex=1;for(j=1;jrj+1rj)Swap(L-rj,L-rj+1);lastExchangeIndex=j;i=lastExchangeIndex;7.3.1 冒泡排序冒泡排序改进算法改进算法排排 序序最好情况(记录按关键字有序排列):只需进行一趟冒泡最好情况(记录按关键字有序排列):只需进行一趟冒泡“比较”的次数:最坏情况(记录按关键字逆序排列):需进行最坏情况(记录按关键字逆序排列):需进行n-1趟冒泡趟冒泡“比较”的次数:0“移动”的次数:“移动”的次数:n-17.3.1 冒泡排序冒泡排序
22、性能分析性能分析排排 序序 首先对无序的记录序列进行首先对无序的记录序列进行“一次划分一次划分”,通过一趟排序通过一趟排序将待排序列将待排序列分成两部分分成两部分,使其中,使其中一部分记录一部分记录的关键字均比的关键字均比另另一部分小一部分小,再,再分别分别对这两部分排序,以达到整个序列有序。对这两部分排序,以达到整个序列有序。无无 序序 的的 记记 录录 序序 列列无序记录子序列无序记录子序列(1)无序子序列无序子序列(2)枢轴枢轴一次划分一次划分分别进行快速排序分别进行快速排序7.3.2 快速排序快速排序基本思想基本思想排排 序序快速排序快速排序 目标目标o找一个记录,找一个记录,以它的关
23、键字作为以它的关键字作为“枢轴枢轴”,凡凡其其关键字小于枢轴关键字小于枢轴的记录的记录移至该记录之前,移至该记录之前,反反之,之,移至该记录之后。移至该记录之后。o一趟排序一趟排序之后,无序序列之后,无序序列L.r low.high将被将被分割成两个部分分割成两个部分:L.rlow.i-1和和L.r i+1.high 且且 L.r j L.r i L.r j (lowji-1)枢轴枢轴 (i+1jhigh)。排排 序序快速排序快速排序 方法方法o关键字通常取第一个记录的值为基准值。关键字通常取第一个记录的值为基准值。o方法:附设两个指针方法:附设两个指针i i和和j j ,初值分别指向,初值分
24、别指向第一第一个记录个记录和和最后一个记录最后一个记录,设关键字为,设关键字为 key key ,首,首先从先从 j j所指位置起所指位置起向前向前搜索,找到第一个搜索,找到第一个小于小于基准值的记录与基准记录交换,然后从基准值的记录与基准记录交换,然后从i i 所指所指位置起位置起向后向后搜索,找到第一个搜索,找到第一个大于大于基准值的记基准值的记录与基准记录交换,重复这两步直至录与基准记录交换,重复这两步直至i=ji=j为止。为止。初始值初始值 46 55 13 42 94 5 17 70快速排序一趟算法快速排序一趟算法初始值初始值 46 55 13 42 94 5 17 70ij17 5
25、5 13 42 94 5 17 7017 55 13 42 94 5 55 70基准X=4617 5 13 42 94 5 55 70移动jij移动ij移动jiii17 5 13 42 94 94 55 7017 5 13 42 94 94 55 7046i jiiii排排 序序第一趟第一趟 13 5 17 42 46 94 55 70快速排序例快速排序例初始值初始值 46 55 13 42 94 5 17 70第二趟第二趟 5 13 17 42 46 70 55 94第三趟第三趟 5 13 17 42 46 55 70 94第四趟第四趟 5 13 17 42 46 55 70 94快速排序快
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 各种 经典 排序 算法
限制150内