大学《数据结构》第七章:排序-第四节-选择排序_第1页
大学《数据结构》第七章:排序-第四节-选择排序_第2页
大学《数据结构》第七章:排序-第四节-选择排序_第3页
大学《数据结构》第七章:排序-第四节-选择排序_第4页
大学《数据结构》第七章:排序-第四节-选择排序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

第四节选择排序选择排序(SelectionSort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。常用的选择排序方法有直接选择排序和堆排序。一、直接选择排序1、排序思想直接选择排序(StraightSelectSoft,)是一种简单的排序方法。它的基本思想是:每次从待排序的无序区中选择出关键字值最小的记录,将该记录与该区中的第一个记录交换位置。初始时,R[1…n]为无序区,有序区为空。第一趟排序是在无序区R[1…n]中选出最小的记录,将它与R[1]交换,R[1]为有序区;第二趟排序是在无序区R[2…n]中选出最小的记录与R[2]交换,此时R[1…2]为有序区;依此类推,做n-1趟排序后,区间R[1…n]中记录递增有序。2、实例分析【例】一组关键字(38,33,65,82,76,38,24,11),直接选择排序过程。3、算法描述voidSelectSort(seqListR,intn){//对R作直接选择排序inti,j,k;for(i=1;i<n;i++)//做n-1趟排序{k=i;//设k为第i趟排序中关键字最小的记录位置for(j=i+1;j<=n;j++)//在[i..n]选择关键字最小的记录if(R[j].key<R[k].key)k=j;//若有比R[k].key小的记录,记住该位置if(k!=i)//与第i个记录交换{R[0]=R[i];R[i]=R[k];R[k]=R[0];}}}4、算法分析(1)时间复杂度无论文件初始状态如何,在第i趟排序中选出最小关键字的记录需要做n-i次比较,总比较次数为(n-1)+(n-2)+…+1=n(n-1)/2;当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,每次交换需要移动3次,总的移动次数取最大值3(n-1)。直接选择排序的平均时间复杂度为O(n2)。(3)空间复杂度直接选择排序的空间复杂度是O(1),是一个就地排序。(4)稳定性直接选择排序是不稳定的。【例】假设采用不带头结点的单链表作为存储结构,试编写一个直接选择排序(升序)的算法。设单链表结点类型和链表类型的定义如下:typedefstructnode{//结点类型定义DataTypedata;//结点数据域Structnode*next;//结点指针域}ListNode;typedefListNode*LinkList;(1)按直接选择排序算法思想,交换结点的数据域和关键字域值的算法。voidLselectsort1(Linklisthead){//先找最小的和第一个结点交换,再找次小的和第二个结点交换,…,以此类推ListNode*p,*r,*s;ListNodeq;p=head;while(p!=NULL)//假设链表不带头结点{s=p;//s为保存当前关键字最小结点地址指针r=p->next;while(r!=NULL)//向后比较,找关键字值最小的结点{if(r->data<s->data)//若r指向结点的关键字值小,使s指向它s=r;r=r->next;//比较下一个}if(s!=p)//说明有关键字值比s的关键字值小的结点,需交换{q=(*p);//整个结点记录赋值p->data=s->data;s->data=q.data;}p=p->next;//指向下一个结点}}(2)按直接选择排序算法思想,每次选择到最小的结点后,将其脱链并加入到一个新链表中,这样可避免结点域值交换,最后将新链表的头指针返回。LinkListLselectSort2(LinkListhead){//找最小的为新表的第一个结点,找次小的作为第二个结点,…,依次类推ListNode*p,*q,*r,*s,*t,*t1;t=NULL//置空表,采用尾插法建立新链表while(head!=NULL){s=head;//先假设s指向关键字最小值的结点p=head;q=NULL;//q指向p的前趋结点r=NULL;//r指向s的前趋结点while(p!=NULL){if(p->data<s->data)//使s指向当前关键字值小的结点{s=p;r=q;//使r指向s的前一个结点}q=p;p=p->next;//指向后继结点}if(s==head)//没发现更小的head=head->next;//删除第一个结点elser->next=s->next;//删除最小结点if(t==NULL){t=s;t1=t;)//t1指向新表的当前尾结点else//插入新结点{t1->next=s;t1=s;}}t1->next=NULL;returnt;//返回新表头指针}二、堆排序1、堆排序定义n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下关系:(1)ki≤K2i且ki≤K2i+1

或(2)Ki≥K2i且ki≥K2i+1(1≤i≤

)前者称为小根堆,后者称为大根堆。【例】关键字序列(76,38,59,27,15,44)就是一个大根堆,还可以将此调整为小根堆(15,27,44,76,38,59),它们对应的完全二又树如图:2、堆排序的思想从小到大排序的步骤:第一步:将参加排序的原始序列转换为第一个大根堆(建初始堆)。第二步:把堆的第一个元素(最大值元素)与堆的最后那个元素交换位置。第三步:将在第二步中"去掉"最大值元素后剩下的元素组成的序列重新调整为一个新的堆。第四步:重复第二步与第三步n-1次,直到排序结束。3、实例分析【例】已知关键字序列为(47,33,1l,56,72,61,25,47),采用堆排序方法对该序列进行堆排序,画出建初始堆的过程和每一趟排序结果。第一步:将参加排序的原始序列转换为第一个大根堆(建初始堆)。第二步:将根结点(最大值)与最后一个结点调换如下图(a)所示,完成第一趟排序,第一趟排序的结果为:47566147331125[72]第三步,将第一趟排序的结果除最后一个元素外的其余结点组成的序列调整为堆,如图(b)所示,然后将根结点与倒数第2个结点调换如下图(c)所示,完成第二趟排序,第二趟排序的结果为:25564747331125[6172]第四步,将第二趟排序的结果除最后2个元素外的其余结点组成的序列调整为堆,如图(d)所示,然后将根结点与倒数第3个结点调换如下图(e)所示,完成第三趟排序,第三趟排序的结果为:1147472533[566172]第五步,将第三趟排序的结果除最后3个元素外的其余结点组成的序列调整为堆,如图(f)所示,然后将根结点与倒数第4个结点调换如图(g)所示,完成第四趟排序,第四趟排序的结果为:11334725[47566172]第六步,将第四趟排序的结果除最后4个元素外的其余结点组成的序列调整为堆,如图(h)所示,然后将根结点与倒数第5个结点调换如图(i)所示,完成第五趟排序,第五趟排序的结果为:253311[4747566172]第七步,将第五趟排序的结果除最后5个元素外的其余结点组成的序列调整为堆,如图(j)所示,然后将根结点与倒数第6个结点调换如图(k)所示,完成第六趟排序,第六趟排序的结果为:1125[334747566172]第八步,将第六趟排序的结果除最后6个元素外的其余结点

温馨提示

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

评论

0/150

提交评论