第11章查找与排序_第1页
第11章查找与排序_第2页
第11章查找与排序_第3页
第11章查找与排序_第4页
第11章查找与排序_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十一章第十一章 查找和排序查找和排序本章内容本章内容查找查找 顺序查找顺序查找 二分查找二分查找 二叉排序树查找二叉排序树查找 哈希查找哈希查找 平均查找长度的计算平均查找长度的计算n 排序排序l 直接插入排序直接插入排序l 直接选择排序直接选择排序l 冒泡排序冒泡排序查找的基本概念查找的基本概念查找:在数据元素集合(查找表)中查找关键字与给定值相等的数据元素。关键字:数据元素中的一个或多个数据项值,它可以惟一标识一个数据元素。平均查找长度(ASL):iniiCPASL1式中,n为查找表的长度;pi为查找第i个元素的概率,在等概率情况下pi等于1/n; Ci为找到第i个元素时的比较次数顺序查

2、找顺序查找 要求: 查找表必须采用线性表。基本思想:用给定值依次与线性表中每个元素的关键字进行比较。如果某个元素的关键字与给定值相同,则查找成功;如果找遍全表也没有发现满足条件的元素,则查找失败。算法实现: 顺序表类和单链表类中的search函数。 实现一:顺序表类中实现顺序查找的成员函数实现一:顺序表类中实现顺序查找的成员函数/查找元素查找元素x并返回其下标,若元素不存在,则返回并返回其下标,若元素不存在,则返回-1/被查找的数存放在一个数组中被查找的数存放在一个数组中,从数组的第一个元素从数组的第一个元素开始,依次往下比较,直到找到要找的元素为止。开始,依次往下比较,直到找到要找的元素为止

3、。int Seqlist:Search ( char x ) int i = 0; for( i = 0; i next; while( p != NULL ) if( p - data = x ) break; p = p - next; return p;顺序查找的平均查找长度评价:在用顺序查找方法完成查找时,每进行一次成功查找需要的平均比较次数约为表长度的一半,因此,它的效率较低。适用于在查找表较小的情况下进行查找。)(21111nOninCPASLniinii二分查找(折半查找)二分查找(折半查找)要求: 必须以顺序方式存储线性表 线性表中所有数据元素必须按照关键字有序排列基本思想:将

4、给定值与处于顺序表“中间位置”上的元素的关键字进行比较,若相等则查找成功;若给定值大于关键字则在表的后半部分继续进行二分查找,否则在表的前半部分继续进行二分查找。如此进行下去直至找到满足条件的元素,或当前查找区为空,此时查找失败。1.设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值。2.初始时,令 low = 0,high = n - 1,mid= (low+high)/2让 k 与 mid 指向的记录比较 若 k = rmid ,查找成功 若 k rmid ,则low = mid + 13.重复上述操作,直至low high时,查找失败。二分查找算法

5、实现二分查找算法实现0Atlanta1Boston2Chicago3Denver4Detroit5Houston6Los Angeles7Miami8New York9Philadelphia10 San Francisco11 Seattle Seattle 11San Francisco10Philadelphia9New York8Miami7Los Angeles6Houston5Detroit4Denver3Chicago2Boston1Atlanta0Seattle 11San Francisco10Philadelphia9New York8Miami7Los Angeles6H

6、ouston5Detroit4Denver3Chicago2Boston1Atlanta0lowhighmid0 1 2 3 4 5 6 7 8 9 105 13 19 21 37 56 64 75 80 88 92找找21例如例如 key = 21 的查找过程的查找过程low 指示查找区间的下界high 指示查找区间的上界mid = (low+high)/2lowhighmid5 13 19 21 37 56 64 75 80 88 920 1 2 3 4 5 6 7 8 9 105 13 19 21 37 56 64 75 80 88 92lowhighmid0 1 2 3 4 5 6 7

7、 8 9 10例例key = 70 的查找过程的查找过程lowhighmid找找70 5 13 19 21 37 56 64 75 80 88 92lowhighmid 5 13 19 21 37 56 64 75 80 88 92low highmid 5 13 19 21 37 56 64 75 80 88 92lowhighmid0 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 105 13 19 21 37 56 64 75 80 88 925 13 19 21 3

8、7 56 64 75 80 88 92lowhigh5 13 19 21 37 56 64 75 80 88 92当下界当下界low大于上界大于上界high时,则说明表中时,则说明表中没有关键字等于没有关键字等于key的元素,查找不成功。的元素,查找不成功。0 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 10例:例:二分查找函数模板及其测试程序二分查找函数模板及其测试程序#include using namespace std;template int BinSearch( T A , int low , int high , T key )int mid;

9、while(low = high)mid=(low + high) / 2;if( key = Amid ) return mid; /查找成功,返回元素的下标查找成功,返回元素的下标if( key Amid ) high=mid-1; /到表的前半部分查找到表的前半部分查找else low = mid + 1; /到表的后半部分查找到表的后半部分查找return -1;/查找失败,返回失败标志查找失败,返回失败标志-1int main()int a = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , k = 7 , i;i = BinSearch(a , 0 , 7 , k)

10、;if( i = -1 )例:例:用递归方法实现二分查找函数模板用递归方法实现二分查找函数模板#include using namespace std;template int BinSearch( T A , int low , int high , T key )int mid;if(low high) return -1; /查找失败,返回失败标志查找失败,返回失败标志-1 elsemid=(low + high) / 2;if( key = Amid ) return mid; /查找成功,返回元素的下标查找成功,返回元素的下标if( key Amid ) BinSearch( A ,

11、 low , mid - 1 , key ); /到表的前半部分查找到表的前半部分查找else BinSearch( A , mid + 1 , high , key ); /到表的后半部分查找到表的后半部分查找 int main()int a = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , k = 7 , i;i = BinSearch(a , 0 , 7 , k);二分查找二分查找在二分查找中,比较的次数取决于所要查找的元素在数组中的位置。对于n个元素的数组,在最坏的情况下所要查找的元素必须查到查找区间只剩下一个元素时才能找到或者能确定该元素根本不在数组中。二分查找优缺

12、点二分查找优缺点优点: 查找效率高 平均查找长度缺点: 查找前要将表中元素按关键字有序排列 只适用于线性表的顺序存储。适用于那种一经建立就很少改动而又经常需要查找的线性表。)(log1) 1(log12122111nOnnnjnCPASLjkjinii搜索算法的效率搜索算法的效率顺序搜索的平均时间性能 (1 + 2 + 3 + + n ) / n = ( n + 1 ) / 2二分查找的最坏情况的时间性能 n / 2 / 2 / 2 / 2 = 1 n=2k使用二分查找算法最多只需要k=log2n次比较即可K次次)(nO)(log2nO平均查找长度:平均查找长度:N和和log2N的值的值Nlo

13、g2N10310071000101,000,000201,000,000,00030二叉排序树查找二叉排序树查找n将数据集合中的数据元素存储为一颗二将数据集合中的数据元素存储为一颗二叉排序树,叉排序树, 然后按给定方法进行查找。然后按给定方法进行查找。二叉排序树的定义:二叉排序树的定义: 二叉排序树或者是一棵空二叉树,或者二叉排序树或者是一棵空二叉树,或者 是具有以下性质的二叉树:是具有以下性质的二叉树: 若它的左子树非空,则左子树上所有结点的若它的左子树非空,则左子树上所有结点的值均小于根结点的值;值均小于根结点的值; 若它的右子树非空,则右子树上所有结点的若它的右子树非空,则右子树上所有结

14、点的值均不小于根结点的值;值均不小于根结点的值; 左、右子树本身又各是一棵二叉排序树。左、右子树本身又各是一棵二叉排序树。二叉排序树二叉排序树二叉排序树:二叉排序树:一种特殊的二叉树,其特点是:左子树上一种特殊的二叉树,其特点是:左子树上所有结点的值均小于其双亲结点的值,右子树上所有结点的所有结点的值均小于其双亲结点的值,右子树上所有结点的值均大于或等于其双亲结点的值。值均大于或等于其双亲结点的值。 56894723152650308020901085403525238866不是二叉排序树。不是二叉排序树。 插入操作:插入操作:若二叉排序树为空,则新结点为二叉排序树的根结点;否若二叉排序树为空

15、,则新结点为二叉排序树的根结点;否则将新结点的关键字值和根结点的关键字值进行比较,若则将新结点的关键字值和根结点的关键字值进行比较,若小于根结点的值,则将新结点插入到左子树中去,否则,小于根结点的值,则将新结点插入到左子树中去,否则,插入到右子树中去。此插入过程是递归进行的。插入到右子树中去。此插入过程是递归进行的。 设有整数序列设有整数序列47,23,56,15,26,89,将其中的值依次插入将其中的值依次插入二叉排序树二叉排序树568947231526152326475689中序遍历结果:中序遍历结果:对二叉排序树进行中序遍历可以得到一个数据元素由小到大对二叉排序树进行中序遍历可以得到一个

16、数据元素由小到大的有序序列。构造二叉排序树的过程即为对无序序列进行排的有序序列。构造二叉排序树的过程即为对无序序列进行排序的过程。序的过程。 删除操作:删除操作:一个结点被删除后,必须保证余下的结点仍然构成一棵二一个结点被删除后,必须保证余下的结点仍然构成一棵二叉排序树。下面分三种情况讨论:叉排序树。下面分三种情况讨论:u 情况二:被删除的结点至少有一棵空子树,则用那棵非空子情况二:被删除的结点至少有一棵空子树,则用那棵非空子 树的根成为其双亲结点的相应子女树的根成为其双亲结点的相应子女50302510153533375362605553625550301015353337u 情况一:若被删除

17、的是叶结点,则将对应双亲结点指针域置空情况一:若被删除的是叶结点,则将对应双亲结点指针域置空u 情况三:被删除的结点有两棵非空的子树情况三:被删除的结点有两棵非空的子树方法一:找到被删除结点在中序遍历序列中的直接后继结方法一:找到被删除结点在中序遍历序列中的直接后继结点(它一定在被删除结点的右子树中),用此后继结点的点(它一定在被删除结点的右子树中),用此后继结点的值取代被删除结点的值,然后删除此后继结点,由于被删值取代被删除结点的值,然后删除此后继结点,由于被删除的后继结点的左子树一定是空子树,所以删除后继结点除的后继结点的左子树一定是空子树,所以删除后继结点的过程同情况二。的过程同情况二。

18、方法二:用被删除结点在中序遍历序列中的直接前驱结方法二:用被删除结点在中序遍历序列中的直接前驱结点(该结点的右子树也一定为空)代替被删除的结点,点(该结点的右子树也一定为空)代替被删除的结点,然后删除这个前驱结点。然后删除这个前驱结点。 50301015353337536255533010153533376255373010153533536255后继结点后继结点前驱结点前驱结点 将结点将结点50删除删除中序遍历结点序列:中序遍历结点序列:10 15 30 33 35 10 15 30 33 35 3737 5050 5353 55 62 55 62用中序遍历该二叉树得到的直接后继用中序遍历该

19、二叉树得到的直接后继结点代替该结点,删除直接后继结点结点代替该结点,删除直接后继结点用中序遍历该二叉树得到的直接前驱用中序遍历该二叉树得到的直接前驱结点代替该结点,删除直接前驱结点结点代替该结点,删除直接前驱结点 查找操作:查找操作:u 查找查找思路:思路:当二叉排序树不为空时,将给定值与根结点的值进行比当二叉排序树不为空时,将给定值与根结点的值进行比较,若相等则查找成功。如果给定值小于根结点的值,较,若相等则查找成功。如果给定值小于根结点的值,则在根结点的左子树中继续查找,否则在根结点的右子则在根结点的左子树中继续查找,否则在根结点的右子树中继续查找。当待查找的二叉排序树为空时,查找失树中继

20、续查找。当待查找的二叉排序树为空时,查找失败。败。u 平均查找长度:平均查找长度:)(log2nOASL 在二叉排序树中查找成功时走过的是一条从根结点到所寻找结点的一条路径,因此,二叉排序树查找的平均查找长度取决于二叉排序树的深度。在二叉排序树中查找关键字值等于在二叉排序树中查找关键字值等于50,35,90,955030802090854035883250505030403550508090)(log2nOASL 平均查找长度:平均查找长度: 二叉排序树的蜕变:二叉排序树的蜕变:例如,由整数序列例如,由整数序列15,23,26,47,56,89 生成的二叉排序树生成的二叉排序树47568915

21、2326平均查找长度与顺序查找相同平均查找长度与顺序查找相同当把一组有序值依次插入到一棵二叉排序树时,生成的二叉排序树将蜕变成一棵单支树。哈希查找哈希查找UKT012.m-1哈希方法:使用函数将哈希方法:使用函数将U映射到表映射到表T0m-1 的下标上的下标上哈希函数哈希函数: h(关键值关键值) 元素存储地元素存储地址址所有可能出现的关键字集合U实际存储关键字集合K哈希表哈希表如果哈希函数是一一映射的,那么增、删、改、查的复杂度都是O(1)的。如果关键字的可能值太多,而数组长度是有限的,那么哈希函数就只能是多对一的,就会产生碰撞。哈希存储哈希存储(哈希表哈希表) 哈希存储(哈希表): 以数据

22、元素的关键字以数据元素的关键字k为自变量,通过一定的函数关系计算为自变量,通过一定的函数关系计算出对应的函数值出对应的函数值h(k),把这个值解释为数据元素的存储地址,把这个值解释为数据元素的存储地址并把数据元素存储到相应的存储单元内(这个过程称为哈并把数据元素存储到相应的存储单元内(这个过程称为哈希)。希)。h(k)称为哈希地址。称为哈希地址。 例:设有一组关键字值例:设有一组关键字值85, 72, 49, 58, 15, 70, 90, 38, 哈希函数哈希函数 h(k) = k mod 12。则对应的哈希地址为:。则对应的哈希地址为: 1, 0, 1, 10, 3, 10, 6, 2冲突

23、: 若有两个不同的关键字若有两个不同的关键字ki和和kj,即,即ki kj(i j)。)。 但但h(ki) = h(kj),这种情况称为冲突。,这种情况称为冲突。 ki与与kj 称为同义词。称为同义词。 采用哈希技术要解决的两个主要问题:采用哈希技术要解决的两个主要问题:u 构造一个好的哈希函数,使出现冲突的机会构造一个好的哈希函数,使出现冲突的机会尽可能少些;尽可能少些;u设计一个有效的解决冲突的办法设计一个有效的解决冲突的办法哈希表哈希表碰撞的解决方法: 开放地址法:如果一个元素该在的位置已经有其他元素,就另安排一个空闲位置。 链地址法:映射到同一位置的元素被串成链表。 解决冲突的方法:开

24、放地址法和链地址法解决冲突的方法:开放地址法和链地址法u 开放地址法:处理用数组存储哈希表时出现的冲突开放地址法:处理用数组存储哈希表时出现的冲突发生冲突时按某种规则形成一个地址探查序列发生冲突时按某种规则形成一个地址探查序列按序列顺序逐个检查各地址单元,直至找到一个未被占按序列顺序逐个检查各地址单元,直至找到一个未被占用的单元为止用的单元为止将发生冲突的数据元素存入该地址单元中。将发生冲突的数据元素存入该地址单元中。 线性探查序列线性探查序列 平方探查序列平方探查序列设哈希表的长度是设哈希表的长度是m,发生冲突的地址是,发生冲突的地址是dd+1, d+2, , m-1, 0, 1, , d-

25、1(d+12)%m, (d-12)%m, (d+22)%m, (d-22)%m, l两种常用的地址探查方法:两种常用的地址探查方法:设哈希表的长度设哈希表的长度11,哈希函数是,哈希函数是h(k) = k % 11,将整数序列,将整数序列54,77,94,89,14,45,76存入哈希表。按存入哈希表。按线性探查法线性探查法处理冲突处理冲突 例例1012346789105477948954 % 11 = 1077 % 11 = 094 % 11 = 689 % 11 = 114 % 11 = 345 % 11 = 1 (冲突冲突)76 % 11 = 10 (冲突冲突)144576线性探查法建立

26、哈希表线性探查法建立哈希表5 线性探查地址序列线性探查地址序列d+1, d+2, , m-1, 0, 1, , d-1等概率时查找成功的平均查找长度:等概率时查找成功的平均查找长度:ASL=(1+1+1+1+1+2+6)/ 7=13/7设哈希表的长度设哈希表的长度11,哈希函数是,哈希函数是h(k) = k % 11,将整数序列,将整数序列54,77,94,89,14,45,76存入哈希表。按平方探查法处理冲突存入哈希表。按平方探查法处理冲突 例例20123456789105477948954 % 11 = 1077 % 11 = 094 % 11 = 689 % 11 = 114 % 11

27、= 345 % 11 = 1 (冲突冲突)76 % 11 = 10 (冲突冲突)144576平方探查法建立哈希表平方探查法建立哈希表(d+12)%m, (d-12)%m, (d+22)%m, (d-22)%m, 平方探查地址序列:平方探查地址序列:将所有哈希地址相同的记录都链接在同一单将所有哈希地址相同的记录都链接在同一单链表中。链表中。哈希表中的每个存储单元中不再存放数据元哈希表中的每个存储单元中不再存放数据元素而是存放相应单链表的头指针素而是存放相应单链表的头指针.例例:给定关键字给定关键字19, 1, 23, 14, 55, 68, 11, 82, 36哈希函数为哈希函数为 H(key)

28、 = key % 7 链地址法链地址法例例:给定关键字给定关键字 19, 1, 23, 14, 55, 68, 11, 82, 36 哈希函数为哈希函数为 H(key) = key % 7 链地址法链地址法 14 11 198268 5536 1 23 0125436哈希查找哈希表的查找过程和建表的过程相似,按哈希存储哈希表的查找过程和建表的过程相似,按哈希存储的方法进行查找。的方法进行查找。假设给定的关键字为假设给定的关键字为k:根据建表时构造的哈希函数根据建表时构造的哈希函数h,计算出哈希地址,计算出哈希地址h(k),如果哈希表中该地址单元为空,则查找,如果哈希表中该地址单元为空,则查找失

29、败。失败。否则,将该地址中记录的关键字与给定值比较,否则,将该地址中记录的关键字与给定值比较,如果相等,则查找成功;如果不等,则按建表如果相等,则查找成功;如果不等,则按建表时设定的处理冲突方法查找下一个地址。如此时设定的处理冲突方法查找下一个地址。如此反复下去,直到某个地址单元为空(查找失败)反复下去,直到某个地址单元为空(查找失败)或者关键字比较相等(查找成功)为止。或者关键字比较相等(查找成功)为止。 排序的基本概念排序的基本概念排序排序:将文件中的记录按排序码非递减:将文件中的记录按排序码非递减(或非递增或非递增)的顺序重新排列。的顺序重新排列。排序码排序码:数据元素中的一个或多个数据

30、项。排序码:数据元素中的一个或多个数据项。排序码可以是关键字,也可以是其他若干数据项的组合。可以是关键字,也可以是其他若干数据项的组合。排序算法的稳定性排序算法的稳定性:如果在待排序的元素序列中,:如果在待排序的元素序列中,存在着多个排序码相同的元素,按照某种排序算法存在着多个排序码相同的元素,按照某种排序算法排序后,这些元素的相对位置仍保持不变,则称该排序后,这些元素的相对位置仍保持不变,则称该排序算法是稳定的,否则就是不稳定的。排序算法是稳定的,否则就是不稳定的。 待排序数据:待排序数据:18 12 10 12 30 16 排序后数据:排序后数据:10 12 12 16 18 30 稳定稳

31、定 排序后数据:排序后数据:10 12 12 16 18 30 不稳定不稳定插入排序插入排序基本思想:把元素ei(0in) 依次插入到由S中前i个元素组成的已经排好序的序列e0, e1, ,ei-1的适当位置上,插入后S的前i+1个元素仍为有序。直接插入排序直接插入排序 以顺序查找的办法找到要插入的元素在已排好序的元素序列中应处的位置。 所有元素分成两个集合:已排序记录集和待排序记录集。初始时,已排序记录集只有一个元素,即e0,待排序记录集是所有剩余元素。然后每次从待排序记录集中选取一个元素,使用顺序查找的方法,找到其在已排序记录集中的位置,将其插入到该位置,直到待排序记录集为空。直接插入排序

32、直接插入排序 把把n n个元素的序列划分为两个子序列:一个为有序;另一个为无序个元素的序列划分为两个子序列:一个为有序;另一个为无序将无序子序列中的元素依次取出插入到有序子序列中,直到无序子将无序子序列中的元素依次取出插入到有序子序列中,直到无序子序列为空,整个排序结束。序列为空,整个排序结束。若待排序数据元素的排序码序列是(若待排序数据元素的排序码序列是(1818,1212,1010,1212,3030,1616) 16 30 12 10 12 16 30 12 10 30 18 12 12 10 16 30 12 16 30 16 18 12 18 12 10 18 12 12 1018

33、18 30 16 12 12 10 第第1趟趟 第第2趟趟 第第3 3趟趟 第第4 4趟趟 第第5趟趟 初始状态初始状态未排序未排序已排序已排序直接插入排序直接插入排序例:例:待排序记录为待排序记录为50,20,75,34,403440752050直接插入排序直接插入排序 直接插入排序的函数模板示例:直接插入排序的函数模板示例:template void InsertionSort(T A, int n)/对对A0An-1排序排序int i , j;T temp;for( i = 1 ; i 0 & temp Aj-1 ; j- )Aj = Aj-1;Aj = temp;算法分析算法分析时间复

34、杂度与元素的初始状态有关时间复杂度与元素的初始状态有关初态为正序时(最好情形)复杂度为初态为正序时(最好情形)复杂度为O(n)初态为逆序时(最坏情形)复杂度是O(n2) 直接插入排序的平均时间复杂度是O(n2)直接插入排序是稳定的排序算法适用于一个长度较短、接近有序的序列34407520505040207534二分插入排序二分插入排序在插入ei时,e0, e1, , ei-1是一个有序序列,所以可以用二分查找法寻找ei的插入位置,从而减少比较次数。二分插入排序是稳定的排序算法,其平均时间复杂度仍是O(n2) 二分插入排序的函数模板示例:二分插入排序的函数模板示例:template void I

35、nsertionSort( T A , int n ) /对对0An-1排序排序int i , j , low , high , mid; T temp; for(i = 1 ; i n ; i+ ) temp = ai; low = 0; high = i - 1; while(low = high) mid = (low + high) / 2; if( temp = low ; j-)Aj+1 = Aj;Alow = temp;选择排序选择排序 基本思想:每次从待排序的元素序列中选择一个最小的元素将其附加到已排好序的元素序列的后面,直至全部元素排好序为止。在初始时,已排好序的元素序列为空

36、,待排序的元素序列中包括了需要排序的所有元素。直接选择排序直接选择排序基本思想:用逐个比较的办法从待排序的元素序列中选出最小的元素。依次对i=0, 1, 2, ,n-2分别执行如下的选择和交换步骤:在元素序列ei, ei+1, , en-1中选择出最小的元素ek;当ki时,交换ei与ek的值。经上述n-1次的选择和交换后,排序工作即已完成。直接选择排序直接选择排序 用逐个比较的办法从待排序的元素序列中选出最小的元素。直接选择排序直接选择排序 第第1 1步:在步:在n n个数据元素中找出排序码最小的数据个数据元素中找出排序码最小的数据 元素,与第元素,与第1 1个元素交换个元素交换第第2 2步:

37、在步:在n-1n-1个数据元素中找出排序码最小的数个数据元素中找出排序码最小的数 据元素,与第据元素,与第2 2个元素交换个元素交换第第i i步:在步:在n-i+1n-i+1个数据元素中找出排序码最小的个数据元素中找出排序码最小的 数据元素,与第数据元素,与第i i元素交换元素交换 未排序未排序已排序已排序163018101216301812301612121016301816301812101212101812121012183016121210第第1趟趟(i=0)第第2趟趟(i=1)第第3趟趟(i=2)第第4 4趟趟(i=3)第第5趟趟(i=4) 初始状态初始状态直接选择排序直接选择排序

38、直接选择排序函数模板:直接选择排序函数模板: 直接选择排序算法是不稳定算法,其平均时间复杂直接选择排序算法是不稳定算法,其平均时间复杂度为度为O(n2),时间复杂度与元素的初态无关,时间复杂度与元素的初态无关template void SelectionSort(T A , int n)/对对A0An-1排序排序 int i , j , k , temp; for(i = 0 ; i n-1 ; i+) /n-1趟选择趟选择 k = i; /假定假定Ai最小最小 for( j = i + 1 ; j n ; j+ ) if( Aj Ak ) k = j; /记当前最小元素的下标记当前最小元素的

39、下标 if(k != i) /Ai不是最小,与不是最小,与Ak交换交换 temp = Ai; Ai = Ak; Ak = temp; 冒泡排序冒泡排序基本思想: 从待排序记录集的一端(这里假定为低端)对相邻的两个元素(e0和e1,e1和e2,en-2和en-1)依次比较它们的排序码,若不符合排序的顺序要求,就将相应的两个元素互换,此过程称为一趟冒泡排序,最多经过n-1趟冒泡排序,排序工作即可完成。 每趟排序的结果是将待排序记录集中排序码最大的元素交换到待排序记录集最后一个元素的位置。假设在一趟冒泡排序时,从ej+1以后没有发生元素的互换,则说明ej+1以后的元素是已经排好序的,下面只需要在e0

40、到ej范围内进行新一趟的冒泡排序,即待排序记录集是从e0到ej,下一趟只需从e0到ej范围内进行。冒泡排序(交换排序)冒泡排序(交换排序)冒冒泡泡排排序序76654913582797第一趟第一趟第三趟第三趟第四趟第四趟第二趟第二趟977665491358279776655849132797766558492713977665584927139776655849271397766558492713第五趟第五趟第六趟第六趟初始状态初始状态#include void main() int a10; for(int i= 0 ; i ai; int temp; for(i = 0 ; i 10; i+

41、)for(int j = 0 ; j aj+1) temp = aj;aj = aj+1;aj+1= temp; #include void main() int a10; for(int i = 0; i ai; bool change = true; int temp; for(i = 0 ; i 10 & change ; i+)change = false; /标志置为假,假设未交换for(int j = 0 ; j aj+1) temp = aj;aj = aj+1;aj+1 = temp;change = true; /标志置为真,有交换算法分析算法分析时间复杂度与元素的初始状态有

42、关。最好情况下的时间复杂度为O(n)。若待排序元素序列已经有序,则排序工作经一趟处理就可结束。此时,对元素排序码的比较次数为最小值n-1,且没有元素的互换。最坏情况下的时间复杂度为O(n2)。若待排序元素序列为逆序,则需要进行n-1趟冒泡。每趟要进行n-i-1次排序码的比较和n-i-1次元素的互换。平均时间复杂度为O(n2)。冒泡排序算法是稳定的。97275813496576待排序记录LastExchangeIndex279758134965762758971349657627581397496576275813499765762758134965977627581349657697待排序记录第一趟排序结束第一趟排序结束27581349657697待排序记录已排序记录27581349657697待排序记录2758134965769727135849657697271349586576972713495865769727134958657697第二趟排序结束第二趟排序结束待排序记录27134958657697待排序记录已排序记录LastExchangeIndex第三趟排序结束第三趟排序结束27134958657697待排序记录已排序记录LastExchangeIndex977665584

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论