网站大量收购独家精品文档,联系QQ:2885784924

chap9内部排序.ppt

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chap9内部排序

第九章 内部排序 四类基本结构: 首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。 无 序 的 记 录 序 列 无序记录子序列(1) 无序子序列(2) 枢轴 一次划分 分别进行快速排序 (见算法9.6) 三、快速排序 98 35 14 55 77 35 62 48 i j i i i j j j j 48 将基准记录r[left]移至x中; j从右向左扫描,直到r[j]x.key时,将r[j]移至空单元r[i],此时r[j]相当于空单元。 i从左向右扫描,直到r[i]x.key时,将r[i]移至空单元r[j],此时r[i]相当于空单元。 i和j相遇时,将基准记录移至r[i]中,完成一次划分过程。 98 62 77 55 48 35 14 35 快速排序举例: 快速排序 void QKSort(RecordType r[],int low, int high ) { int pos; if(lowhigh) { pos=QKPass(r, low, high); /*将枢轴元素为界划分两个子表*/ QKSort(r, low, pos-1); /*对左部子表快速排序*/ QKSort(r, pos+1, high); /*对右部子表快速排序*/ } } 一趟快速排序 int QKPass(RecordType r[],int left,int right) { RecordType x; int low,high; x= r[left]; low=left; high=right; while ( lowhigh ) { while (low high r[high].key=x.key ) high--; if ( low high ) /* 找到小于x.key的记录,则进行交换*/ { r[low]= r[high]; low++; } while (lowhigh r[low].keyx.key ) low++; if ( lowhigh ) /* 找到大于x.key的记录,则交换*/ { r[high]= r[low]; high--; } } r[low]=x; /*将基准记录保存到low=high的位置*/ return low; /*返回基准记录的位置*/ }   假设一次划分所得枢轴位置 i=k,则对n 个记录进行快排所需时间:  其中 Tpass(n)为对 n 个记录进行一次划分所需时间。 若待排序列中记录的关键字是随机分布的,则 k 取 1 至 n 中任意一值的可能性相同。 T(n) = Tpass(n) + T(k-1) + T(n-k) 四、快速排序的时间分析 设 Tavg(1)≤b 则可得结果: 结论: 快速排序的时间复杂度为O(nlogn) 由此可得快速排序所需时间的平均值为: 若待排记录的初始状态为按关键字有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n2)。 为避免出现这种情况,需在进行一次划分之前,进行“予处理”,即: 先对 R(s).key, R(t).key 和 R[?(s+t)/2?].key,进行相互比较,然后取关键字为 “三者之中”的记录为枢轴记录。 9.4 选 择 排 序 简 单 选 择 排 序 树 形 选 择 排 序 堆 排 序 假设排序过程中,待排记录序列的状态为: 有序序列R[1..i-1] 无序序列 R[i..n] 第 i 趟 简单选择排序 从中选出 关键字最小的记录 有序序列R[1..i] 无序序列 R[i+1..n] 一、简单选择排序 98 35 14 55 77 35 62 48 i k 简单选择排序举例: 98 35 48 55 77 35 62 14 i k 98 35 48 55 77 62 35 14 i k 98 62 48 55 77 35 35 14 i k 简单选择排序 void SelectSort(RecordType r[], int length)

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档