ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:65.73KB ,
资源ID:5211246      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5211246.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(链表的选择排序.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

链表的选择排序.docx

1、链表的选择排序 排序采用选择法:306590805445 把30 接到80后面45接到90后面90替原来45的位置* 预备知识: NODE *v,*u,*p,*h;U,v,h,p都是指针,它们只是地址性的可以指向结构 next而链表中的表有next指针* 链表排序h45 65 54 80 90 30要实现45和90 的交换:30 要接到80后面45 要接到90后面90 要接到h后面90 45 65 54 80 30 要实现45和80 的交换:30 接到54后面45 接到80后面80要接到90后面。即插入到90后面所以一般情况需要用:两个指针 vold v 指出45 两个指针 mold max

2、指出最大这样可以方便的实现 v 或max,移走或被替换时,其它的可以接上。但如果要被替换的是第一个,如45被90替换。h,vold,v max45 65 54 80 90 30Max指向90, 30 放到80后面, h,vold,v max45 65 54 80 30 90 45 放到90后面,h,v,vold都跟着45移动, max h,vold,v 90 45 65 54 80 30h=max 还要一个游动指针 ,u, 用于不断和v比较为了继续进行,下一轮开始前应该为:h ,vold v,max u 90 45 65 54 80 30vold要指向90, v指向45, u指向54所以对于第

3、一次交换后还要移动vold if(vold=v) 时,vold=h;总之一个比较可行的程序为:while (v-next != NULL) /省去 空的v, /选择法 for(max=v,uold= u = v-next; u-next != NULL;uold=u, u = u-next) if (u-score max-score ) mold=uold; max = u; /找到最大的 /u已移动,但队列未动/ u-next = NULL即u是最后一个表,跳出循环,/ 还要判别u指向的表是最大吗?if(u-scoremax-score) mold =uold; max=u; /最后一个

4、if (max!= v) mv-next= max-next; max-next =v; if(vold=v) h=max; else vold-next=max; 。可见用以上方法指针比较多,而且指针移动比较麻烦。因为一开始,不能够用vold=vold-next;方式。并且上述程序还未完全调通* 为此,一种常用的方法,引入一个空表接到h的后面先比较45 和65 :if( v-next-score next-score ) ,.比出最大后 , 90要插入到u的位置时,要做下面的步骤: 1. 30 接到 80后面 . max独立出来 2. max-next =u; 3. v-next=max;

5、v=v-.next, u=v-next 将来输出时 return h-next;, 就可以把空表让过具体分析:引进一个vNODE *v=(NODE*)malloc(sixeof(NODE); V u304565908054hp p1 p2 p3 p4 p5 p6v-next =h; h=v; 把v插入h和p1(45)之间先比较p1=u(45)和p2 (65)为了适合循环: v-next-score, u-next-score表示要比较的数据:u-score=45,p2.score = 65P=v; u=v-next ; (v-next=u) u-score=45 , v-next-score=

6、45p2=u-next=65 p2.score= u-next-score=65for(p=v,u=v-next; u-next!=NILL; u=u-next) if( p-next-score next-score) p=u;找出最大的表u-next-score=(90), 然后交换(90) (45)v u u u (即max)309080546545p 把30 接到80后面: 90 的指针要保存45接到90后面90替代45位置一、90要独立出来,同时30 接到80后面,需要两个指针: 1. p=u?, u=p-next : p指向 80 u指向 90 90要独立出来,所以要用指针u指向它

7、,以免丢掉, u要移走,所以先用p指向 80 2. p-next =u-next : 30 接到80后面二、 : 45接到90后面, u-next=v-next; 三、90替代45位置 v-next =u : V=v-next, u=v-.next 准备下一轮 NODE *bubblesort(NODE *h) NODE *v,*u,*p; v = (NODE *)malloc(sizeof(NODE); v-next =h; h=v; while (v-next != NULL) /选择法 for(p = v, u = v-next; u-next != NULL; u = u-next)

8、if (u-next-score p-next-score ) p = u; /找到最大的 /u已移动,但队列未动 if (p != v) u = p-next; p-next = u-next; /ok u-next =v-next; v-next =u; v=v-next; return h-next; /h; * 14Sort()排序 由于学生信息采用的是单链表存储结构,所以选用直接插入算法较为简单。直接插入算法的基本方法是:每步将一个待排序的记录按其排序码值的大小插到前面已经排好序的表中,直到全部插入为止。基于这样的方法首先将链表的头结点看作是已排好序的结点,然后取下一个结点作为待排序

9、的结点,插入到已排好序的表中。由于单链表的特性,所以具体的思路如下: (1)先将原表头结点作为新排好序表的头结点h,原表下一个结点作为原表头结点h1。设原表如图1l 所示,表中只列出总分数据。 图 11设新表头结点即 h是新链表, h1是旧链表(2)原表头结点为待排序结点,将其总分与新表结点的总分进行比较,如果待排序结点总分大,则插在新表的头,否则插入在其后,原表头结点后移一位,如图 12所示。 (3)重复第二步,即将原表头结点的总分和新表结点的总分进行比较,如果待排序结点总分小,则移动新表指针,直到找到合适的位置将其插入,直到原表为空,所有结点排序完毕,如图 13所示。 这个排序算法实际上是

10、先从原表删除头结点,然后在新表中查找到合适的位置,进行插入。待排序结点的插入位置总是插在表头、表尾和表中间三种情况之一,由于单链表的特性,实际插入结点时,并不需要移动和交换结点信息,而是只改变指针关系,所以排序时间主要用在比较上。排好序后将其名次数据写入数据域order中。STUDENT *sort(STUDENT *h) int i=0; /*保存名次*/ STUDENT *p,*q,*t,*hl; /*定义临时指针*/ hl=h-next; /*将原表头指针所指的下一个结点作为头指针*/ h1-next=NULL; /*第一个结点为新表的头结点*/ ? while(hl!=NULL) /*

11、当原表不为空时,进行排序*/ t=hl; /*取原表的头结点*/ hl=hl-next; /*原表头结点指针后移*/ p=h; /*设定移动指针P,从头指针开始, 即,h1中的每一个,从h的头比较起*/ q=h; /*设定移动指针q作为P的前一个=pold,初值为头指针*/ 原表取第一个和新表从头进行比较 while(t-sum sum & p!=NULL) /*进行总分比较*/ q=p; /*待排序点值小,则新表指针后移*/ p=p-next; /*直到t-sum p-sum时,t插到p的前面 if(p=q) /*说明待排序点值最大,应排在首位*/ t-next=p; /*待排序点的后继为p*/ h=t; /*新头结点为待排序点*/ else /*待排序点应插入在中间某个位置q和P之间,如果P为空则是尾部*/ t-next=p; /*t的后继是P*/ q-next=t; /*q的后继是t*/ p=h; /*排序完成p指针回到链表头,准备填写名次*/ /因为是降序i=1即第一名, i=2, 第二名 while(p!=NULL) /* P不为空时,进行下列操作*/ i+; /*结点序号*/ p-order=i; /*将名次赋值*/ p=p-next; /*指针后移*/ printf(sort sucess!n); /*排序成功*/ return h; /*返回头指针*/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1