- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实用数据结构基础 第9章 排序 第9章 排 序 知 识 点 排序的基本概念 插入排序方法:直接选择排序、二分插入排序 快速排序、选择排序、归并排序 各种排序方法性能比较 难 点 堆排序 快速排序 归并排序 要 求 熟练掌握以下内容: 熟悉各种内部排序方法的基本思想和特点 各种排序方法的优缺点及性能比较 熟悉并掌握一些基本的排序算法 了解以下内容: 二路归并排序算法 堆排序算法 第9章 目录 9-1 概述 9-2 插入排序 9-3 快速排序 9-4 选择排序 9-5 归并排序 9-6 各种排序方法比较 小 结 实验9 排序子系统 习题9 9-1 概 述 9-2 插入排序 9-3 快速排序法 9-3-2 快速排序(Quick Sort) 1.基本思想 就排序时间而言,快速排序被认为是一种最好的内部排序方法。通过一趟快速排序将待排序的记录组分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好,这个过程称为一趟快速排序。第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。显然,这是一个递归的过程,不断进行下去,直到每个待排序的子序列中只有一个记录时为止,整个排序过程结束。快速排序是对冒泡排序的一种改进。 这里有个问题,就是如何把一个记录组分成两个部分?通常是以序列中第一个记录的关键字值作为枢轴记录。 5.效率分析 空间效率:快速排序是递归的,每层递归调用时的指针和参数均要用栈来存放,递归调用层次数与上述二叉树的深度一致。因而,存储开销在理想情况下为O(log2n),即树的高度;在最坏情况下,即二叉树是一个单链,为O(n)。 时间效率:在n个记录的待排序列中,一次划分需要约n次关键码比较,时效为O(n),若设T(n)为对n个记录的待排序列进行快速排序所需时间。 理想情况下:每次划分,正好将分成两个等长的子序列,则时间复杂度为O(nlog2n); 最坏情况下:快速排序每次划分,只得到一个子序列,这时快速排序蜕化为冒泡排序的过程,其时间复杂度最差,为O(n2)。 快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。 快速排序是一个不稳定的排序方法。 选择排序主要是从待排序列中选取一个关键字值最小的记录,把它与第一个记录交换存储位置,使之成为有序。然后在余下的无序的记录中,再选出关键字最小的记录与无序区中的第一个记录交换位置,又使之成为有序。依次类推,直至完成整个排序。 9-4-1 简单选择排序 1.基本思想 (1)初始状态:整个数组r划分成两个部分,即有序区(初始为空)和无序区。 (2)基本操作:从无序中选择关键字值最小的记录,将其与无序区的第一个记录交换(实质是添加到有序区尾部)。 从初态(有序区为空)开始,重复步骤(2),直到终态(无序区为空)。 9-5 归并排序 if (ij) R[j- -]=R[i]; } R[i]=pivot; return i; } ? void QuickSort(int low,int high) // 递归形式的快排序 { int pivotpos,k; if (lowhigh) { pivotpos=Partition(low,high); //调用Partition(low,high)函数 QuickSort(low,pivotpos-1); // 对低子表递归排序 QuickSort(pivotpos+1,high); // 对高子表递归排序 } } 返 回 9-4 选择排序 2.【例9-6】对:53 36 48 36 60 7 18 41 进行简单选择排序 3.算法 void Selectsort() { for (i=1;in;i++) { h=i; for (j=i+1;j=n;j++) if (R[j].keyR[h].key) // 选择关键字值最小的记录 h=j; if (h!=j) { R[0]=R[i];R[i]=R[h];R[h]=R[0];}
文档评论(0)