《数据结构》--排序讲述.pptx

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 排序 计科系 王丹丹 主要内容 排序的基本概念与分类 冒泡排序 简单选择排序 直接插入排序 希尔排序 堆排序 归并排序 快速排序 9.2 排序的基本概念与分类 9.2.1 排序的稳定性 27 16 9 31 7 24 17 9 7 9 9 16 17 24 27 31 7 9 9 16 17 24 27 31 Data 稳定性排序:Data 不稳定性排序:Data 9.2.2 内排序与外排序 按待排序记录所在位置分类 内排序:待排序的所有记录全部被放置在内存中。 外排序:排序过程需要对外存进行访问的排序。 影响内排序性能的因素 时间性能 衡量其好坏的最重要的标志。高效率的排序算法应是尽可能少的关键字比较次数和记录移动次数。 辅助空间 衡量的主要标准。辅助空间是除了存放待排序所占用的存储空间之外,执行算法所需要的其他存储空间。 算法复杂性 算法本身的复杂性。 按排序依据原则分类 插入排序 交换排序 选择排序 归并排序 直接插入排序、希尔排序 冒泡排序、快速排序 直接选择排序、堆排序 2-路归并排序 基数排序 多关键字排序 9.2.3 排序用到的结构与函数 排序的基本操作 排序用顺序表结构 #define MAXSIZE 10//用于要排序数组个数最大值typedef struct { int r[MAXSIZE+1]; //用于存储要排序数组 //r[0]用作哨兵或临时变量 int length; }SqList; 比较两个关键字 将记录从一个位置移动到另一个位置 数组两元素的交换函数 /*交换L中数组r的下标i和j的值*/ void swap(SqList *L, int i, int j) { int temp = L-r[i]; L-r[i] = L-r[j]; L-r[j] = temp; } 9.3 冒泡排序 冒泡排序(Bubble Sort)的基本思想 两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 冒泡排序的实现步骤 将第一个记录的关键字与第二个记录的关键字进行比较,若为反序L-r[1]L-r[2],则交换;比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序。 对前n-1个记录进行第二趟冒泡排序,使关键字次大的记录被安置在第n-1个记录位置。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。 9.3.1 最简单排序实现 /*对顺序表L作交换排序(冒泡排序初级版)*/ void BubbleSort0(SqList *L) { int i, j; for (i = 1; i L-length; i++) { for (j = i + 1; j =L-length; j++) { if (L-r[i]L-r[j]) { swap(L, i, j);//交换L-r[i]与L-r[j]的值 } } } } 9.3.2 冒泡排序算法 /*对顺序表L作冒泡排序*/ void BubbleSort(SqList *L) { int i, j; for (i = 1; i L-length; i++) { for (j = L-length-1; j = i; j--) { if (L-r[j]L-r[j+1]) { swap(L, j, j+1); //交换L-r[j]与L-r[j+1]的值 } } } } 与上一算法的差异:注意j是从后往前循环。 9.3.3 冒泡排序优化 如果待排序的序列是{2,1,3,4,5,6,7,8,9},即除了第一和第二的关键字需要交换外,别的都已经是正常的顺序,但仍然将i=2到9以及每个循环中的j都执行一遍。 尽管并没有交换数据,但是之后的大量比较还是大大地多余了。 冒泡程序是否还可以优化呢? 9.3.3 冒泡排序优化 /*对顺序表L改进冒泡算法*/ void BubbleSort2(SqList *L) { int i, j; Status flag = TRUE; //flag用来作为标记 for (i = 1; i L-length flag; i++) //若flag为true则退出循环 { flag = FALSE; //初始为false for (j = L-length - 1; j = i; j--) { if (L-r[j]L-r[j+1]) { swap(L, j, j+1); //交换L-r[j]与L-r[j+1]的值 flag = TRUE; //如果有数据交

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档