- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
25* 16 08 21 25 49 1 2 3 4 5 6 08 16 25* 25 21 49 1 3 6 5 4 2 25* 16 21 08 25 49 08 16 21 25* 25 49 交换 1 号与 4 号对象, 4 号对象就位 从 1 号到 4 号 重新 调整为最大堆 堆调整 21 16 25* 08 25 49 1 2 3 4 5 6 08 16 25* 25 21 49 1 3 6 5 4 2 21 16 08 25* 25 49 08 16 21 25* 25 49 交换 1 号与 3 号对象, 3 号对象就位 从 1 号到 3 号 重新 调整为最大堆 堆调整 冒泡排序的改进算法 void BubbleSort ( SqList L ) { for (i=n, Change =TRUE; i = 2 Change; --i ) { Change = FALSE; for ( j=1; j i; ++j ) if ( L. r[j]. key L. r[j+1]. key ) { ElemType temp=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=temp; Change=TRUE; } } } 最坏情况(逆序): 最好情况(正序): 比较次数:n-1 移动次数:0 比较次数: 移动次数: 2 ) 1 ( 1 - = ? = n n (n-i) n-1 i 2 ) 1 ( 1 - = ? = n 3n 3(n-i) n-1 i 算法分析 时间复杂度为O(n2) 稳定性:稳定 基本思想:任取待排序对象序列中的某个对象(例如取第一个对象)作为枢轴(pivot),按照该对象的关键字大小,将整个对象序列划分为左右两个子序列: 2. 快速排序(Quick Sort) 左侧子序列中所有对象的关键字都小于枢轴对象的关键字。 右侧子序列中所有对象的关键字都大于或等于枢轴对象的关键字。 枢轴对象则排在这两个子序列中间(这也是该对象最终应安 放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。 一趟快速排序的具体过程 49 38 65 97 76 13 27 49 pivot=49 low high 27 low 65 high 13 low 97 high high 49 第一趟结果: [ 27 38 13 ] 49 [ 76 97 65 49 ] 小于49 大于等于49 快速排序每一趟的划分 int Partition ( SqList L, int low, int high ) { /* 交换顺序表L中子表r [low… high] 的记录,枢轴记录到位,并返回其所在 的位置,此时在它之前(后)的记录均不大(小)于它 */ } // Partition 快速排序每一趟的划分 int Partition ( SqList L, int low, int high ) { /* 交换顺序表L中子表r [low… high] 的记录,枢轴记录到位,并返回其所在 的位置,此时在它之前(后)的记录均不大(小)于它 */ L. r[0]=L. r[low]; // 用子表的第一个记录作枢轴记录 int pivotkey = L. r[low]. key; // 枢轴记录关键字 } // Partition 快速排序每一趟的划分 int Partition ( SqList L, int low, int high ) { /* 交换顺序表L中子表r [low… high] 的记录,枢轴记录到位,并返回其所在 的位置,此时在它之前(后)的记录均不大(小)于它 */ L. r[0]=L. r[low]; // 用子表的第一个记录作枢轴记录 int pivotkey = L. r[low]. key; // 枢轴记录关键字 while ( low high ) { } } // Partition 快速排序每一趟的划分 int Partition (
文档评论(0)