收藏 分享(赏)

第十章内部排序(白底黑字).ppt

上传人:gnk289057 文档编号:7756983 上传时间:2019-05-25 格式:PPT 页数:63 大小:713KB
下载 相关 举报
第十章内部排序(白底黑字).ppt_第1页
第1页 / 共63页
第十章内部排序(白底黑字).ppt_第2页
第2页 / 共63页
第十章内部排序(白底黑字).ppt_第3页
第3页 / 共63页
第十章内部排序(白底黑字).ppt_第4页
第4页 / 共63页
第十章内部排序(白底黑字).ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、结束 第 1 页怯蹄楼蛛席句札峪截存柴贫捉拣勾饲苇网怖蒜搐日瘩义兼幽陋擎治童态抛第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 2 页10.1 概 述1、排序定义 将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 2、排序分类l按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序l按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序: 2-路归并排序 基数排序满臻裹隐忧趣埂船仑判冀者拧种怯座茫窗渊昧阴忙弥命举谁钎函盎苟敖苛第十章内部排

2、序(白底黑字)第十章内部排序(白底黑字)结束 第 3 页l按排序所需工作量 简单的排序方法: T(n)=O(n) 先进的排序方法: T(n)=O(nlogn) 基数排序: T(n)=O(d.n) 排序基本操作l比较两个关键字大小l将记录从一个位置移动到另一个位置10.1 概 述鳞诺扎改床扇畜伏宁羹佯朗矽弟腋街卯神昂睬烤扒里疆彻挞称呢釜龙胸鸟第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 4 页10.1 概 述3、稳性排序:在待排记录序列中,任何两个关键字相同的记录,用某种排序方法排序后相对位置不变,则称这种排序方法是稳定的,否则称为不稳定的。例 设 49,38,65,97,76,

3、13,27,49 是待排序列排序后 :13,27,38,49,49,65,76,97 稳定排序后 :13,27,38,49,49,65,76,97 不稳定稳性排序的应用:例 股票交易系统 考虑一种股票交易 (清华紫光 ))1)顾客输入:股东帐号、股票代码、申购价格、数量,股票交易系统将用户申购请求插入申购队列队尾;2)股票交易系统按如下原则交易:A)申购价高者先成交B)申购价相同者按申购时间先后顺序成交讽瓦拎冰撮花赴歼磺揖坞万绚唯舍埠奔待躬吓虑撕煞忌琶栈帆逼搀衅整忌第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 5 页10.1 概 述如何实现股票交易系统 ?申购队列:用线性表表示

4、交易前:将申购队列按申购价排序,显然为满足交易原则,要求排序方法是稳定的申购队列( 09,10),(06,10.5),(033,9.8),(051,10)排序后: (06,10.5),(09,10),(051,10),(033,9.8)4、 存贮方式待排序的记录序列通常有下列三种存贮方法:1)顺序表2)静态链表:在排序过程,只需修改指针,不需要移动记录;3)待排记录本身有放在连续单元中,同时另建一索引表 用于存放各记录存贮位置;排序时不移过记录本身,而移动索引表中的记录 “地址 ”,在排序结束后再按地址调整记录的存贮位置挞谗本敛忍崖惩官炭殴坞出逛月黄卵垂欺放康甄输衡回实授昆琐援丝卡远第十章内部

5、排序(白底黑字)第十章内部排序(白底黑字)结束 第 6 页10.1 概 述顺序表类型说明#define MAXSIZE 20 /一个用作示例的小顺序表的最大长度typedef int KeyType; /定义关键字类型为整数类型typedef structKeyType key; /关键字项InfoType otherinfo; /其它数据项RedType; /记录类型typedef structRedType rMAXSIZE+1; /r0闲置或用作哨兵单元Int length; /顺序表长度SqList; /顺序表类型拙癸于览绽健的烧览苔恬处沁摔苔旭焉铁撂摔侠狮踢嫌默驭筐漠覆狗阅审第十章内

6、部排序(白底黑字)第十章内部排序(白底黑字)结束 第 7 页10.2 插入排序10.2.2 直接插入排序 基本思想 :依次将待排记录插入到有序子表中,并使插入子表后仍保持有序,直到全部记录插入完毕;初始时,有序子表中只有一个元素。插入排序的关键:如何查找插入位置。直接插入排序(也称为顺序插入排序):排序过程:整个排序过程为 n-1趟插入,即先将序列中第 1个记录看成是一个有序子序列,然后从第 2个记录开始,逐个进行插入,直至整个序列有序例:待排记录 49 38 65 97 76 13 27 49 ( 49) 38 65 97 76 13 27 49 ( 38 49) 65 97 76 13 2

7、7 49 ( 38 49 65) 97 76 13 27 49 ( 38 49 65 97) 76 13 27 49 ( 38 49 65 76 97) 13 27 49( 13 38 49 65 76 97) 27 49( 13 27 38 49 65 76 97) 49( 13 27 38 49 49 65 76 97)一趟直接插入排序耐垛梳代蛇号罚谨盈咆佃摸罩凸柑登天聘猫宇苞龄偏殖芽剧绚顽装惟竹捅第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 8 页10.2 插入排序void InsertSort(SqList ihigh,得到插入位置,转 lowhigh, m=(low+

8、high)/2; / 取表的中点,并将表一分为二,确定待插入区间 */ 若 r0.keylength;i+) /* 循环地将 ri插入到有序序列中去 */ l-r0=l-ri; low=1;high=i-1; /* 本次插入初始化 */while (lowr0rm) high=m-1; else low=m+1; for (j=i-1;j=high+1;-j) /* 后移填空 */l-rj+1=l-rj;l-rhigh+1= l-r0; /* 待插入元存入指定位置 */ /确定插入位置所进行的折半查找,关键码的比较次数至多为 次。 移动记录的次数和直接插入排序相同,故时间复杂度仍为 O(n2)

9、。是一个稳定的排序方法。 log2(n+1)透搭躁朴扎啼燃膛肛喜陋吠赌熊衬谚呕耿喉崖睡稳浓必挽车股洼槽稍著裂第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 13 页10.2 插入排序10.2.2 其他插入排序2、 2-路插入排序2路排序是在折半插入排序的基础上再改进,目的是减少排序过程中移动记录的次数。方法是:另设一个数组 d ,首先将 L.r1赋值给 d1,并将 d1看成是在排序好序列中出于中间位置的记录,从 L.r中第 2个记录起依次插入到 d1之前或 d1之后的有序序列中。在实现算法时,可以将 d看成是一个循环向量,并设两个指针 first和 final分别指示排序过程中得

10、到的有序序列的第一个记录和最后一个记录在 d中的位置。3、表插入排序 直接插入排序、折半插入排序均要大量移动记录,时间开销大。若要不移动记录完成排序,需要改变存储结构,进行表插入排序。所谓表插入排序,就是通过链接指针,按关键码的大小,实现从小到大的链接过程,为此需增设一个指针项。操作方法与直接插入排序类似,所不同的是直接插入排序要移动记录,而表插入排序是修改链接指针。用静态链表来说明。殆读便雌问媒介摘蕉蛹悔墨炮州都块谈假葬疲酸蚂杖蓟嗽稿悲瓜璃仙吞固第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 14 页10.2 插入排序10.2.2 其他插入排序#define SIZE 200t

11、ypedef struct RedType rc; /*元素类型 :记录项 */int next; /*指针项 */SLNode; /*表结点类型 */typedef struct SLNode rSIZE; /*静态链表 ,0号单元为表关结点 */int length; /*表长度 */SLinkListType; /*静态链表类型 */假设数据元素已存储在链表中,且 0号单元作为头结点,不移动记录而只是改变链指针域,将记录按关键码建为一个有序链表。首先,设置空的循环链表,即头结点指针域置 0,并在头结点数据域中存放比所有记录关键码都大的整数。接下来,逐个结点向链表中插入即可。变权吕愤黍融朵

12、冬坚舟尺驮表娥蝇坏漫味卸新居舶袍戒脏郸内灸抓厕堵险第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 15 页10.2 插入排序3、表插入排序 假设数据元素已存储在链表中,且 0号单元作为头结点,不移动记录而只是改变链指针域,将记录按关键码建为一个有序链表。首先,设置空的循环链表,即头结点指针域置 0,并在头结点数据域中存放比所有记录关键码都大的整数。接下来,逐个结点向链表中插入即可。婆动著姬屹涸茸啄绿沾锥甜赡洪钒浮涡前鲁吸睛扶筋纹厕封乐评式抛擞逾第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 16 页10.2 插入排序3、表插入排序 抗溪纂蘸帖养察撵瑞桃孜浅展冒拾火段

13、末边赖迢咨蛙或袖钻忻挑守朵介扔第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 17 页10.2 插入排序3、表插入排序表插入排序得到一个有序的链表,查找则只能进行顺序查找,而不能进行随机查找,如折半查找。为此,还需要对记录进行重排。重排记录方法:按链表顺序扫描各结点,将第 i个结点中的数据元素调整到数组的第 i个分量数据域。因为第 i个结点可能是数组的第 j个分量,数据元素调整仅需将两个数组分量中数据元素交换即可,但为了能对所有数据元素进行正常调整,指针域也需处理。漱握蝗哮料楔漠陆周均诽半诬郎拟御凰湘忆桥榨靠戚疽凋豌肋匠贮限卓铃第十章内部排序(白底黑字)第十章内部排序(白底黑字)

14、结束 第 18 页10.2 插入排序3、表插入排序【算法】1.j=l-r0.next;i=1;/指向第一个记录位置,从第一个记录开始调整2.若 i=l-length时,调整结束;否则,a.若 i=j, j=l-rj.next; i+;转 (2) /数据元素应在这分量中,不用调整,处理下一个结点b.若 ji, l-ri.eleml-rj.elem; /交换数据元素p=l-rj.next; / 保存下一个结点地址l-rj.next=l-i.next; l-i.next=j; / 保持后续链表不被中断j=p; i+;转 (2) / 指向下一个处理的结点c. 若 jrj.next; /j分量中原记录已

15、移走,沿 j的指针域找寻原记录的位置转到 (a)润夕惧粮阐篆测弓呼架直袍醋熙征抠揉提揖镀料墒实岛瓦阔彪仙蒋株钟籍第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 19 页10.2 插入排序桥钠滓葫迢杆浓拄廖逗幕祁踊姐九刘沸一随话刻凯强怨乏轿茎杉厌拟刚抢第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 20 页10.2 插入排序媒虎膏枫贰应由怪咖募铲努幼垄官诊姚驶濒惨役宦吨颗柳集奔河委弟副秘第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 21 页10.2 插入排序表插入排序位置重排算法:Void B_InsertSort(NodeType R ,int n)

16、 /将表插入算法已排序好的静态链表元素位置重排int I,j,p; DataType s; j=R0.next; I=1;while(Ilength;i+)if(L-ri.key ri-dk.key) /*小于时,需位置为 i的元素插入有序表 */ L-r0=L-ri; /*为统一算法设置监测 */for(j=i-dk;j0j=j-dk)L-rj+dk=L-rj; /*记录后移 */L-rj+dk=L-r0; /*插入到正确位置 */谢欧敌傣贺扇串糜先破满鸟侯依聚刚袱严语寨有狠涤冒邵锑茄殷相捉砷戚第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 25 页10.2 插入排序4、希尔排

17、序 (缩小增量法 shells sort)void ShellSort(sqlist *L,int d,int t) /*按增量序列 d0, 1 , t-1对顺序表 R1n 作希尔排序 */int k;for(k=0;kri+1.key时, r0=ri; ri=ri+1; ri+1=r0;将 ri与 ri+1交换 i=i+1; 调整对下两个记录进行两两比较,转 冒泡排序方法:对 n个记录的表,第一趟冒泡得到一个关键码最大的记录 rn,第二趟冒泡对 n-1个记录的表,再得到一个关键码最大的记录 rn-1,如此重复,直到 n个记录按关键码有序的表。 、云皑禽厉学委疥撕想关稍铂由贞难叫士贺冤骄薛待弊

18、美衍葡秆姑襟赴疼谰第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 27 页10.3 快速排序【效率分析】空间效率:仅用了一个辅助单元。时间效率:总共要进行 n-1趟冒泡,对 j个记录的表进行一趟冒泡需要 j-1次关键码比较。记录移动的次数与比较次数相同数量级,最坏的情况也发生在排序表逆序时。冒泡排序时一个稳定的排序方法。秃茫莫锯瞒妥璃辰遮煮逐画初梗影鹊伸洪惩绣厚苯屋栈硝供试爵琢折伊薪第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 28 页10.3 快速排序2、快速排序l基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关

19、键字小,则可分别对这两部分记录进行排序,以达到整个序列有序l排序过程:对 rst 中记录进行一趟快速排序,附设两个指针i和 j,设枢轴记录 rp=rs, x=rp.key初始时令 i=s,j=t首先从 j所指位置向前搜索第一个关键字小于 x的记录,并和rp交换再从 i所指位置起向后搜索,找到第一个关键字大于 x的记录,和 rp交换重复上述两步,直至 i=j为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止家折薪柑隙泉悬舅蛀过昭譬撩箱挪吟卞追炭孪碎际崭并巴术搭娟竹渡男再第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 29 页10.3 快速排序例 初始关键字: 49

20、 38 65 97 76 13 27 50 i jxji完成一趟排序: ( 27 38 13) 49 (76 97 65 50) 分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 974927i i ji49 65j13 49i49 97ij踞波撰蛙面集斧冻婚抬狞械敬火丹植意掣服濒亭滥牡乞它佃橡衬羽惕氧盟第十章内部排序(白底黑字)第十章内部排序(白底黑字)结束 第 30 页10.3 快速排序l void quicksort(sqlist *l,int left,int right )l int i,j

21、,t;l if (leftai;l dol l while (iaj) j=j-1; /*从右往左找第一个小于等于 t的元素 */l if (iai=l-aj;i=i+1; /*将 aj的值填入左端,并设新左端 */l while (il-ai) i=i+1; /*从左往右找第一个大于 t的元素 */l if (iaj=l-ai;j=j-1; /*将 ai的值填入右端,并设新右端 */l l while (i!=j);l l-ai=t; /*t存入相应位置 */l quicksort( l,left,j-1); /*递归对左段和右段进行快速排序*/l quicksort( l,i+1,right);l l 维谎蚌敖皖轿粕水汕当拥竣蠕韭缓差弃绕榨央纂丙馁惺底慈尉圃秃越泡彼第十章内部排序(白底黑字)第十章内部排序(白底黑字)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报