chap9C课件清华大学郑莉

上传人:鲁** 文档编号:571447648 上传时间:2024-08-10 格式:PPT 页数:81 大小:466.50KB
返回 下载 相关 举报
chap9C课件清华大学郑莉_第1页
第1页 / 共81页
chap9C课件清华大学郑莉_第2页
第2页 / 共81页
chap9C课件清华大学郑莉_第3页
第3页 / 共81页
chap9C课件清华大学郑莉_第4页
第4页 / 共81页
chap9C课件清华大学郑莉_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《chap9C课件清华大学郑莉》由会员分享,可在线阅读,更多相关《chap9C课件清华大学郑莉(81页珍藏版)》请在金锄头文库上搜索。

1、chap9-C+chap9-C+课件课件- -清华大学清华大学郑莉郑莉C+语言程序设计清华大学 郑莉本章主要内容本章主要内容l模板模板l群体类群体类l群体数据的组织群体数据的组织2C+语言程序设计清华大学 郑莉第一部分第一部分模板模板l函数模板函数模板l类模板类模板3C+语言程序设计清华大学 郑莉函数模板函数模板l函数模板可以用来创建一个通用功能函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。步简化重载函数的函数体设计。l声明方法:声明方法:template 函数声明 函 数 模 板4C+语言程序设计清华大学 郑莉求绝

2、对值函数的模板求绝对值函数的模板#includeusing namespace std;templateT abs(T x) return x0?-x:x; int main() int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; 函 数 模 板运行结果:运行结果:55.55C+语言程序设计清华大学 郑莉求绝对值函数的模板分析求绝对值函数的模板分析l编译器从调用编译器从调用abs()时实参的类型,推时实参的类型,推导出函数模板的类型参数。例如,对导出函数模板的类型参数。例如,对于调用表达式于调用表达式abs(n),由于实参,由于实参

3、n为为int型,所以推导出模板中类型参数型,所以推导出模板中类型参数T为为int。l当类型参数的含义确定后,编译器将当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:以函数模板为样板,生成一个函数:intabs(intx)returnx0?-x:x; 函 数 模 板6C+语言程序设计清华大学 郑莉类模板的作用类模板的作用使用类模板使用户可以为类声明一使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本的返回值,能取任意类型(包括基本类型的和用户

4、自定义类型)。类型的和用户自定义类型)。类 模 板7C+语言程序设计清华大学 郑莉类模板的声明类模板的声明l类模板:类模板:template class 类名类成员声明l如果需要在类模板以外定义其成员如果需要在类模板以外定义其成员函数,则要采用以下的形式:函数,则要采用以下的形式:template 类型名 类名:函数名(参数表)类 模 板8C+语言程序设计清华大学 郑莉例例9-2类模板应用举例类模板应用举例#include#includeusingnamespacestd;/结构体结构体StudentstructStudentintid;/学号学号floatgpa;/平均分平均分;类 模 板9

5、template/类模板:实现对任意类型数据进行存取类模板:实现对任意类型数据进行存取classStoreprivate:Titem;/用于存放任意类型的数据用于存放任意类型的数据inthaveValue;/用于标记用于标记item是否已被存入内容是否已被存入内容public:Store(void);/默认形式(无形参)的构造函数默认形式(无形参)的构造函数TGetElem(void);/提取数据函数提取数据函数voidPutElem(Tx);/存入数据函数存入数据函数;/默认形式构造函数的实现默认形式构造函数的实现templateStore:Store(void):haveValue(0)1

6、010template/提取数据函数的实现提取数据函数的实现TStore:GetElem(void)/如果试图提取未初始化的数据,则终止程序如果试图提取未初始化的数据,则终止程序if(haveValue=0)coutNoitempresent!endl;exit(1);returnitem;/返回返回item中存放的数据中存放的数据template/存入数据函数的实现存入数据函数的实现voidStore:PutElem(Tx)haveValue+;/将将haveValue置为置为TRUE,表示,表示item中已存入数值中已存入数值item=x;/将将x值存入值存入item1111intmain

7、()Studentg=1000,23;StoreS1,S2;StoreS3;StoreD;S1.PutElem(3);S2.PutElem(-7);coutS1.GetElem()S2.GetElem()endl;S3.PutElem(g);coutThestudentidisS3.GetElem().idendl;coutRetrievingobjectD;coutD.GetElem()endl;/输出对象输出对象D的数据成员的数据成员/由于由于D未经初始化未经初始化,在执行函数在执行函数D.GetElement()时出错时出错1212C+语言程序设计清华大学 郑莉第二部分第二部分群群体数据

8、体数据l线性群体线性群体线性群体的概念直接访问群体-数组类顺序访问群体-链表类栈类队列类13C+语言程序设计清华大学 郑莉群体的概念群体的概念群体群体是指由多个数据元素组成的集是指由多个数据元素组成的集合体。群体可以分为两个大类:合体。群体可以分为两个大类:线性群线性群体体和和非线性群体非线性群体。线性群体中的元素按位置排列有序,线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。可以区分为第一个元素、第二个元素等。非线性群体不用位置顺序来标识元非线性群体不用位置顺序来标识元素。素。14C+语言程序设计清华大学 郑莉线性群体的概念线性群体的概念线性群体中的元素次序与其位置关线性

9、群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照系是对应的。在线性群体中,又可按照访问元素的不同方法分为访问元素的不同方法分为直接访问直接访问、顺顺序访问序访问和和索引访问索引访问。在本章我们只介绍直接访问和顺序在本章我们只介绍直接访问和顺序访问。访问。第一个元素第二个元素第三个元素最后一个元素15C+语言程序设计清华大学 郑莉数组数组l静态数组是具有固定元素个数的群体,其静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。中的元素可以通过下标直接访问。缺点:大小在编译时就已经确定,在运行时无法修改。l动态数组由一系列位置连续的,任意数量动态数组由一系列位置连续的,任

10、意数量相同类型的元素组成。相同类型的元素组成。优点:其元素个数可在程序运行时改变。l动态数组类模板:例动态数组类模板:例9-3(9_3.h)直接访问的线性群体16#ifndefARRAY_CLASS#defineARRAY_CLASSusingnamespacestd;#include#include#ifndefNULLconstintNULL=0;#endif/NULLenumErrorTypeinvalidArraySize,memoryAllocationError,indexOutOfRange;char*errorMsg=Invalidarraysize,Memoryallocat

11、ionerror,Invalidindex:;动态数组类模板程序1717templateclassArrayprivate:T*alist;intsize;voidError(ErrorTypeerror,intbadIndex=0)const;public:Array(intsz=50);Array(constArray&A);Array(void);Array&operator=(constArray&rhs);T&operator(inti);operatorT*(void)const;intListSize(void)const;voidResize(intsz);1818C+语言程序

12、设计清华大学 郑莉数组类模板的构造函数数组类模板的构造函数/构造函数构造函数templateArray:Array(intsz)if(sz=0)/sz为数组大小(元素个数),若小于为数组大小(元素个数),若小于0,则输出错误信息,则输出错误信息Error(invalidArraySize);size=sz;/将元素个数赋值给变量将元素个数赋值给变量sizealist=newTsize;/动态分配动态分配size个个T类型的元素空间类型的元素空间if(alist=NULL)/如果分配内存不成功,输出错误信息如果分配内存不成功,输出错误信息Error(memoryAllocationError);

13、直接访问的线性群体19C+语言程序设计清华大学 郑莉数组类的拷贝构造函数数组类的拷贝构造函数templateArray:Array(constArray&X)intn=X.size;size=n;alist=newTn;if(alist=NULL)Error(memoryAllocationError);T*srcptr=X.alist;/X.alist是对象是对象X的数组首地址的数组首地址T*destptr=alist;/alist是本对象中的数组首地址是本对象中的数组首地址while(n-)/逐个复制数组元素逐个复制数组元素*destptr+=*srcptr+;直接访问的线性群体20C+语

14、言程序设计清华大学 郑莉浅拷贝浅拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBint main() Array A(10); . Array B(A); .template Array:Array( const Array& X) size = X.size; alist= X.alist;21C+语言程序设计清华大学 郑莉深拷贝深拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBB的数组元素占用的内存22C+语言程序设计清华大

15、学 郑莉数组类的重载数组类的重载=运算符函数运算符函数templateArray&Array:operator=(constArray&rhs)intn=rhs.size;if(size!=n)deletealist;alist=newTn;if(alist=NULL)Error(memoryAllocationError);size=n;T*destptr=alist;T*srcptr=rhs.alist;while(n-)*destptr+=*srcptr+;return*this;直接访问的线性群体23C+语言程序设计清华大学 郑莉数组类的重载下标操作符函数数组类的重载下标操作符函数te

16、mplateT&Array:operator(intn)/检查下标是否越界检查下标是否越界if(nsize-1)Error(indexOutOfRange,n);/返回下标为返回下标为n的数组元素的数组元素returnalistn;直接访问的线性群体24C+语言程序设计清华大学 郑莉为什么有的函数返回引用为什么有的函数返回引用l如果一个函数的返回值是一个对象的如果一个函数的返回值是一个对象的值,它就被认为是一个常量,不能成值,它就被认为是一个常量,不能成为左值。为左值。l如果返回值为引用。由于引用是对象如果返回值为引用。由于引用是对象的别名,所以通过引用当然可以改变的别名,所以通过引用当然可以

17、改变对象的值。对象的值。直接访问的线性群体25C+语言程序设计清华大学 郑莉重载指针转换操作符重载指针转换操作符templateArray:operatorT*(void)const/返回当前对象中私有数组的首地址返回当前对象中私有数组的首地址returnalist;直接访问的线性群体26C+语言程序设计清华大学 郑莉指针转换运算符的作用指针转换运算符的作用#includeusingnamespacestd;intmain()inta10;voidread(int*p,intn);read(a,10);voidread(int*p,intn)for(inti=0;ipi;intmain()Ar

18、raya(10);voidread(int*p,n);read(a,10);voidread(int*p,intn)for(inti=0;ipi;直接访问的线性群体27C+语言程序设计清华大学 郑莉Array类的应用类的应用l例例9-4求范围求范围2N中的质数,中的质数,N在程序在程序运行时由键盘输入。运行时由键盘输入。直接访问的线性群体28#include#include#include9_3.husingnamespacestd;intmain()ArrayA(10);intn;intprimecount=0,i,j;cout=2asupperlimitforprimenumbers:;c

19、inn;Aprimecount+=2;/2是一个质数是一个质数for(i=3;in;i+)if(primecount=A.ListSize()A.Resize(primecount+10);if(i%2=0)continue;j=3;while(ji/2)Aprimecount+=i;for(i=0;iprimecount;i+)coutsetw(5)Ai;if(i+1)%10=0)coutendl;coutendl;2929C+语言程序设计清华大学 郑莉链表链表l链表是一种动态数据结构,可以用来链表是一种动态数据结构,可以用来表示顺序访问的线性群体。表示顺序访问的线性群体。l链表是由系列链表

20、是由系列结点结点组成的,结点可以组成的,结点可以在运行时动态生成。在运行时动态生成。l每一个结点包括每一个结点包括数据域数据域和指向链表中和指向链表中下一个结点的下一个结点的指针指针(即下一个结点的(即下一个结点的地址)。如果链表每个结点中只有一地址)。如果链表每个结点中只有一个指向后继结点的指针,则该链表称个指向后继结点的指针,则该链表称为单链表。为单链表。顺序访问的线性群体30C+语言程序设计清华大学 郑莉单链表单链表 data1 data2 data3 datan NULLheadrear顺序访问的线性群体31C+语言程序设计清华大学 郑莉单链表的结点类模板单链表的结点类模板templa

21、teclassNodeprivate:Node*next;public:Tdata;Node(constT&item,Node*ptrnext=NULL);voidInsertAfter(Node*p);Node*DeleteAfter(void);Node*NextNode(void)const;顺序访问的线性群体32C+语言程序设计清华大学 郑莉在结点之后插入一个结点在结点之后插入一个结点 data1 data2 p datatemplatevoidNode:InsertAfter(Node*p)/p节点指针域指向当前节点的后继节点节点指针域指向当前节点的后继节点p-next=next;n

22、ext=p;/当前节点的指针域指向当前节点的指针域指向p顺序访问的线性群体33C+语言程序设计清华大学 郑莉删除结点之后的结点删除结点之后的结点顺序访问的线性群体 data1 data2 data3Node*Node:DeleteAfter(void)Node*tempPtr=next;if(next=NULL)returnNULL;next=tempPtr-next;returntempPtr;tempPtr34C+语言程序设计清华大学 郑莉链表的基本操作链表的基本操作l生成结点生成结点l插入结点插入结点l查找结点查找结点l删除结点删除结点l遍历链表遍历链表l清空链表清空链表顺序访问的线性群

23、体35C+语言程序设计清华大学 郑莉链表类模板链表类模板(例例9-6)/9_6.h#ifndefLINKEDLIST_CLASS#defineLINKEDLIST_CLASS#include#includeusingnamespacestd;#ifndefNULLconstintNULL=0;#endif/NULL#include9_5.h顺序访问的线性群体36templateclassLinkedListprivate:Node*front,*rear;Node*prevPtr,*currPtr;intsize;intposition;Node*GetNode(constT&item,Nod

24、e*ptrNext=NULL);voidFreeNode(Node*p);voidCopyList(constLinkedList&L);3737public:LinkedList(void);LinkedList(constLinkedList&L);LinkedList(void);LinkedList&operator=(constLinkedList&L);intListSize(void)const;intListEmpty(void)const;voidReset(intpos=0);voidNext(void);intEndOfList(void)const;intCurrent

25、Position(void)const;3838voidInsertFront(constT&item);voidInsertRear(constT&item);voidInsertAt(constT&item);voidInsertAfter(constT&item);TDeleteFront(void);voidDeleteAt(void);T&Data(void);voidClearList(void);#endif/LINKEDLIST_CLASS3939C+语言程序设计清华大学 郑莉链表类应用举例链表类应用举例(例例9-7)#includeusingnamespacestd;#inc

26、lude9_6.h#include9_6.cppintmain()LinkedListLink;inti,key,item;for(i=0;iitem;Link.InsertFront(item);顺序访问的线性群体40coutList:;Link.Reset();while(!Link.EndOfList()coutLink.Data();Link.Next();coutendl;coutkey;Link.Reset();4141while(!Link.EndOfList()if(Link.Data()=key)Link.DeleteAt();Link.Next();coutList:;Li

27、nk.Reset();while(!Link.EndOfList()coutLink.Data();Link.Next();coutendl;4242C+语言程序设计清华大学 郑莉特殊的线性群体特殊的线性群体栈栈栈是只能从一端访问的线性群体,栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈可以访问的这一端称栈顶,另一端称栈底。底。ana2a1入栈出栈栈顶栈底特殊的线性群体栈43C+语言程序设计清华大学 郑莉栈的应用举例栈的应用举例函数调用函数调用特殊的线性群体栈main调fun(参数)结束fun(参数)返回参数当前现场返回地址入栈当前现场返回地址出栈参数出栈当前现场 返回地址4

28、4C+语言程序设计清华大学 郑莉栈的应用举例栈的应用举例表达式处理表达式处理ba/a/b+c*d(a)t1+a/b+c*dt1=a/b(b)dct1*+a/b+c*d(c)t3a/b+c*dt3=t1+t2(e)t2t1+a/b+c*dt2=c*d(d)特殊的线性群体栈45C+语言程序设计清华大学 郑莉栈的基本状态栈的基本状态l栈空栈空栈中没有元素l栈满栈满栈中元素个数达到上限l一般状态一般状态栈中有元素,但未达到栈满状态特殊的线性群体栈46栈顶ana1a0入栈出栈数组下标maxn10一般状态栈顶入栈出栈数组下标初始状态(栈空)maxn10栈顶amaxana1a0入栈出栈数组下标maxn10栈

29、满状态4747C+语言程序设计清华大学 郑莉栈的基本操作栈的基本操作l初始化初始化l入栈入栈l出栈出栈l清空栈清空栈l访问栈顶元素访问栈顶元素l检测栈的状态(满、空)检测栈的状态(满、空)特殊的线性群体栈48C+语言程序设计清华大学 郑莉栈类模板栈类模板(例例9-8)特殊的线性群体栈/9-8.h#ifndefSTACK_CLASS#defineSTACK_CLASS#include#includeusingnamespacestd;constintMaxStackSize=50;templateclassStackprivate:TstacklistMaxStackSize;inttop;pu

30、blic:Stack(void);voidPush(constT&item);TPop(void);voidClearStack(void);TPeek(void)const;intStackEmpty(void)const;intStackFull(void)const;/类的实现略类的实现略49C+语言程序设计清华大学 郑莉栈的应用栈的应用l例例9.9一个简单的整数计算器一个简单的整数计算器实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算3+5则输入3 5 +。乘方运算符用表示。每次运算在前次结果基础

31、上进行,若要将前次运算结果清除,可键入c。当键入q时程序结束。l9-9.h9-9.cpp特殊的线性群体栈50/9_9.h#include#include#include#includeusingnamespacestd;enumBooleanFalse,True;#include9_8.hclassCalculatorprivate:StackS;voidEnter(intnum);BooleanGetTwoOperands(int&opnd1,int&opnd2);voidCompute(charop);public:voidRun(void);voidClear(void);5151voi

32、dCalculator:Enter(intnum)S.Push(num);BooleanCalculator:GetTwoOperands(int&opnd1,int&opnd2)if(S.StackEmpty()cerrMissingoperand!endl;returnFalse;opnd1=S.Pop();if(S.StackEmpty()cerrMissingoperand!endl;returnFalse;opnd2=S.Pop();returnTrue;5252voidCalculator:Compute(charop)Booleanresult;intoperand1,opera

33、nd2;result=GetTwoOperands(operand1,operand2);if(result)switch(op)case+:S.Push(operand2+operand1);break;case-:S.Push(operand2-operand1);break;case*:S.Push(operand2*operand1);break;case/:if(operand1=0)cerrDivideby0!endl;S.ClearStack();elseS.Push(operand2/operand1);break;case:S.Push(pow(operand2,operan

34、d1);break;cout=S.Peek()c,*c!=q)switch(*c)casec:S.ClearStack();break;case-:if(strlen(c)1)Enter(atoi(c);elseCompute(*c);break;case+:case*:case/:case:Compute(*c);break;default:Enter(atoi(c);break;5454voidCalculator:Clear(void)S.ClearStack();/9_9.cpp#include9-9.hintmain()CalculatorCALC;CALC.Run();5555C+

35、语言程序设计清华大学 郑莉特殊的线性群体特殊的线性群体队列队列队列是只能向一端添加元素,从另队列是只能向一端添加元素,从另一端删除元素的线性群体一端删除元素的线性群体a1 a2an-1 an队头队尾入队出队a056C+语言程序设计清华大学 郑莉队列的基本状态队列的基本状态l队空队空队列中没有元素l队满队满队列中元素个数达到上限l一般状态一般状态队列中有元素,但未达到队满状态特殊的线性群体队列57a0 a1an-1 an队头队尾入队出队数组下标 0 1 n-1 n max(一般状态)队头队尾入队出队数组下标 0 1 n-1 n max(队空状态) a0 a1 an-1 an amax队头队尾入队

36、出队数组下标 0 1 n-1 n max(队满状态)元素移动方向元素移动方向5858C+语言程序设计清华大学 郑莉循环队列循环队列在想象中将数组弯曲成环形,元素在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组到数组最后一个元素时,便再回到数组开头。开头。特殊的线性群体队列591234m-1m-2m-30amam+1am+2a3队头队尾a4am-2am-3am-1队满状态 元素个数=m1234m-1m-2m-30队尾队头队空状态 元素个数=0队尾1234m-1m-2m-30a0a1a2a3队头一般状态6060C+

37、语言程序设计清华大学 郑莉例例9-10队列类模板队列类模板特殊的线性群体队列#ifndefQUEUE_CLASS#defineQUEUE_CLASS#include#includeusingnamespacestd;constintMaxQSize=50;templateclassQueueprivate:intfront,rear,count;TqlistMaxQSize;public:Queue(void);voidQInsert(constT&item);TQDelete(void);voidClearQueue(void);TQFront(void)const;intQLength(v

38、oid)const;intQEmpty(void)const;intQFull(void)const;/成员函数的实现略成员函数的实现略61C+语言程序设计清华大学 郑莉第三部分第三部分群群体数据的组织体数据的组织l插入排序插入排序l选择排序选择排序l交换排序交换排序l顺序查找顺序查找l折半查找折半查找62C+语言程序设计清华大学 郑莉排序(排序(sorting)l排序排序是计算机程序设计中的一种重要操作,是计算机程序设计中的一种重要操作,它的功能是将一个它的功能是将一个数据元素数据元素的任意序列,重的任意序列,重新排列成一个按新排列成一个按关键字关键字有序的序列。有序的序列。数据元素:数据的

39、基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。关键字:数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。l在排序过程中需要完成两种基本操作:在排序过程中需要完成两种基本操作:比较两个数的大小调整元素在序列中的位置群体数据的组织63C+语言程序设计清华大学 郑莉内部排序与外部排序内部排序与外部排序l内部排序:内部排序:待排序的数据元素存放在待排序的数据元素存放在计算机内存中进行的排序过程。计算机内存中进行的排序过程。l外部排序:外部排序:待排序的数据元素数量很待排序的数据元素数量很大,以致内存存中一次不能容纳全部大,以致内存存中一次不能容纳全部数据,在排

40、序过程中尚需对外存进行数据,在排序过程中尚需对外存进行访问的排序过程。访问的排序过程。群体数据的组织64C+语言程序设计清华大学 郑莉内部排序方法内部排序方法l插入排序插入排序l选择排序选择排序l交换排序交换排序群体数据的组织65C+语言程序设计清华大学 郑莉插入排序的基本思想插入排序的基本思想l每一步将一个待排序元素按其关键字值的大小插入到已排每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。序序列的适当位置上,直到待排序元素插入完为止。初始状态:初始状态: 5 4 10 20 12 3 5 4 10 20 12 3插入操作:插入操作:1 1 4

41、4 4 5 10 20 12 3 4 5 10 20 12 32 2 1010 4 5 10 20 12 3 4 5 10 20 12 33 3 2020 4 5 10 20 12 3 4 5 10 20 12 34 4 1212 4 5 10 12 20 3 4 5 10 12 20 35 5 33 3 4 5 10 12 20 3 4 5 10 12 2066C+语言程序设计清华大学 郑莉直接插入排序直接插入排序l在插入排序过程中,由于寻找插入位置的在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,方法不同又可以分为不同的插入排序算法,这里我们只介绍最简单的直接插入

42、排序算这里我们只介绍最简单的直接插入排序算法。法。l例例9-11直接插入排序函数模板(直接插入排序函数模板(9_11.h)群体数据的组织67templatevoidInsertionSort(TA,intn)inti,j;Ttemp;for(i=1;i0&tempAj-1)Aj=Aj-1;j-;Aj=temp;直接插入排序函数模板(9_11.h)6868C+语言程序设计清华大学 郑莉选择排序的基本思想选择排序的基本思想每次从待排序序列中选择一个关键字最小的元素,每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的(当需要按关键字升序排列时),顺序排在已

43、排序序列的最后,直至全部排完。最后,直至全部排完。5 4 10 20 12 5 4 10 20 12 3 3 初始状态:初始状态:3 3 4 4 10 20 12 5 10 20 12 53 4 10 20 12 3 4 10 20 12 5 5 第 i i 次选择后,将选出的那个记录与第 i i 个记录做交换交换。3 4 5 20 12 3 4 5 20 12 1010 . .69C+语言程序设计清华大学 郑莉直接选择排序直接选择排序l在选择类排序方法中,从待排序序列在选择类排序方法中,从待排序序列中选择元素的方法不同,又分为不同中选择元素的方法不同,又分为不同的选择排序方法,其中最简单的是

44、通的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小过顺序比较找出待排序序列中的最小元素,称为直接选择排序。元素,称为直接选择排序。l例例9-12直接选择排序函数模板(直接选择排序函数模板(9-12.h)群体数据的组织70templatevoidSwap(T&x,T&y)Ttemp;temp=x;x=y;y=temp;templatevoidSelectionSort(TA,intn)intsmallIndex;inti,j;for(i=0;in-1;i+)smallIndex=i;for(j=i+1;jn;j+)if(AjAsmallIndex)smallIndex=j;Swa

45、p(Ai,AsmallIndex);直接选择排序函数模板(9-12.h)7171C+语言程序设计清华大学 郑莉交换排序的基本思想交换排序的基本思想两两比较待排序序列中的元素,并两两比较待排序序列中的元素,并交换不满足顺序要求的各对元素,直到交换不满足顺序要求的各对元素,直到全部满足顺序要求为止。全部满足顺序要求为止。群体数据的组织72C+语言程序设计清华大学 郑莉最简单的交换排序方法最简单的交换排序方法起泡排序起泡排序对具有对具有n个元素的序列按升序进行起泡排序的个元素的序列按升序进行起泡排序的步骤:步骤:首先将第一个元素与第二个元素进行比较,若为逆序,则将两元素交换。然后比较第二、第三个元素

46、,依次类推,直到第n-1和第n个元素进行了比较和交换。此过程称为第一趟起泡排序。经过第一趟,最大的元素便被交换到第n个位置。对前n-1个元素进行第二趟起泡排序,将其中最大元素交换到第n-1个位置。如此继续,直到某一趟排序未发生任何交换时,排序完毕。对n个元素的序列,起泡排序最多需要进行n-1趟。群体数据的组织73C+语言程序设计清华大学 郑莉起泡排序举例起泡排序举例对整数序列对整数序列85243按升序排序按升序排序8524352438243582345823458初始状态第一趟结果第二趟结果第三趟结果第四趟结果小的逐渐上升每趟沉下一个最大的群体数据的组织74C+语言程序设计清华大学 郑莉例例9

47、-13起泡排序函数模板起泡排序函数模板templatevoidSwap(T&x,T&y)Ttemp;temp=x;x=y;y=temp;templatevoidBubbleSort(TA,intn)inti,j;intlastExchangeIndex;i=n-1;while(i0)lastExchangeIndex=0;for(j=0;ji;j+)if(Aj+1Aj)Swap(Aj,Aj+1);lastExchangeIndex=j;i=lastExchangeIndex;群体数据的组织75C+语言程序设计清华大学 郑莉顺序查找顺序查找l其基本思想其基本思想从序列的首元素开始,逐个元素与待查

48、找的关键字进行比较,直到找到相等的。若整个序列中没有与待查找关键字相等的元素,就是查找不成功。l顺序查找函数模板顺序查找函数模板例9-14群体数据的组织76templateintSeqSearch(Tlist,intn,Tkey)for(inti=0;in;i+)if(listi=key)returni;return-1;顺序查找函数模板7777C+语言程序设计清华大学 郑莉折半查找的基本思想折半查找的基本思想对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。群体数据的组织

49、78C+语言程序设计清华大学 郑莉折半查找举例折半查找举例用折半查找法,在下列序列中查找值为用折半查找法,在下列序列中查找值为2121的元素:的元素:L=1513192137566475808892H=11M =INT(L+H)/2)=6513192137L=1H=M-1=5M=INT(L+H)/2)=3M2137HL=M+1=4LM=INT(L+H)/2)=4M79C+语言程序设计清华大学 郑莉例例10-5折半查找函数模板折半查找函数模板templateintBinSearch(Tlist,intn,Tkey)intmid,low,high;Tmidvalue;low=0;high=n-1;while(low=high)mid=(low+high)/2;midvalue=listmid;if(key=midvalue)returnmid;elseif(keymidvalue)high=mid-1;elselow=mid+1;return-1;群体数据的组织80结束语结束语谢谢大家聆听!谢谢大家聆听!81

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号