《选择排序算法》教学课件2_第1页
《选择排序算法》教学课件2_第2页
《选择排序算法》教学课件2_第3页
《选择排序算法》教学课件2_第4页
《选择排序算法》教学课件2_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

选择排序

选择排序是指在排序过程序中,依次从待排序的记录序列中选择出关键字值最小的记录、关键字值次小的记录、……,并分别将它们定位到序列左侧的第1个位置、第二个位置、……,最后剩下一个关键字值最大的记录位于序列的最后一个位置,从而使待排序的记录序列成为按关键字值由小到大排列的的有序序列。简单选择排序1.简单选择排序的基本思想

每一趟在n-i+1(i=1,2,3,...,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。它的具体实现过程为:(1)将整个记录序列划分为有序区域和无序区域,有序区域位于最左端,无序区域位于右端,初始状态有序区域为空,无序区域含有待排序的所有n个记录。(2)设置一个整型变量index,用于记录在一趟的比较过程中,当前关键字值最小的记录位置。开始将它设定为当前无序区域的第一个位置,即假设这个位置的关键字最小,然后用它与无序区域中其他记录进行比较,若发现有比它的关键字还小的记录,就将index改为这个新的最小记录位置,随后再用a[index].key与后面的记录进行比较,并根据比较结果,随时修改index的值,一趟结束后index中保留的就是本趟选择的关键字最小的记录位置。(3)将index位置的记录交换到无序区域的第一个位置,使得有序区域扩展了一个记录,而无序区域减少了一个记录。不断重复(2)、(3),直到无序区域剩下一个记录为止。此时所有的记录已经按关键字从小到大的顺序排列就位。

简单选择排序算法简单选择排序的整体结构应该为:for(i=1;i<n;i){

第i趟简单选择排序;}

下面我们进一步分析一下“第i趟简单选择排序”的算法实现。(1)初始化:假设无序区域中的第一个记录为关键字值最小的元素,即将index=i;

下面我们进一步分析一下“第i趟简单选择排序”的算法实现。(2)搜索无序区域中关键字值最小的记录位置:

for(j=i+1;j<=n;j++) if(a[j].key<a.[index].ke)index=j;

下面我们进一步分析一下“第i趟简单选择排序”的算法实现。(3)将无序区域中关键字最小的记录与无序区域的第一个记录进行交换,使得有序区域由原来的i-1个记录扩展到i个记录。

完整算法voidselecsort(DataTypea,intn){for(i=1;i<n;i++) //对n个记录进行n-1趟的简单选择排序

{index=i; //初始化第i趟简单选择排序的最小记录指针

for(j=i+1;j<=n;j++) //搜索关键字最小的记录位置

if(a[j].key<a[i].key)index=j;if(index!=i){temp=a[i];a[i]=a[index];a[index]=temp; }}}简单选择排序算法简单,但是速度较慢,并且是一种不稳定的排序方法.,但在排序过程中只需要一个用来交换记录的暂存单元。堆排序1.堆排序的基本思想:堆排序是另一种基于选择的排序方法。下面我们先介绍一下什么是堆?然后再介绍如何利用堆进行排序。

2.堆定义:

由n个元素组成的序列{k1,k2,……,kn-1,kn},当且仅当满足如下关系时,称之为堆。例如序列(47,35,27,26,18,7,13,19)满足:

若将堆看成是一棵以k1为根的完全二叉树,则这棵完全二叉树中的每个非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此可以看出,若一棵完全二叉树是堆,则根结点一定是这n个结点中的最小者或最大者。下面给出两个堆的示例。下面我们讨论一下如何利用堆进行排序?从堆的定义可以看出,若将堆用一棵完全二叉树表示,则根结点是当前堆中所有结点的最小者(或最大者)。堆排序的基本思想是:首先将待排序的记录序列构造一个堆,此时,选出了堆中所有记录的最小者或最大者,然后将它从堆中移走,并将剩余的记录再调整成堆,这样又找出了次小(或次大)的记录,以此类推,直到堆中只有一个记录为止,每个记录出堆的顺序就是一个有序序列。堆排序的筛选算法:voidsift(DataTypea,intk,intm){i=k;;j=2*i;temp=a[i];

while(j<=m)//{if(j<m&&a[j].key<a[j+1].key)j++;if(a[i].key>a[j].key)break;

else{a[i]=a[j];i=j;j=2*i;}}a[i]=temp;}堆排序完整的算法:voidheapsort(DataTypea,intn){h=n/2;//最后一个非终端结点的编号

for(i=h;i>=1;i--)//初建堆。从最后一个非终端结点至根结点

sift(a,i,n);for(i=n;i>1;i--)//重复执行移走堆顶结点及重建堆的操作

{temp=a[1];a[1]=a[i];a[i]=temp;sift(a,1,i-1);}}

在堆排序中,除建初堆以外,其余调整堆的过程最多需要比较树深次,因此,与

温馨提示

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

评论

0/150

提交评论