首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 软件水平考试 > 复习资料 > 软件设计师 > 正文

软考软件设计师专题讲义十:常用的算法设计方法

来源:考试吧Exam8.com) 2010-10-4 11:50:54 考试吧:中国教育培训第一门户 模拟考场
考试吧整理了软考软件设计师专题讲义,帮助考生备考软考软件设计师考试。
第 1 页:1.常用的算法设计方法
第 23 页:2.几个重要的算法程序

  2.几个重要的算法程序

  2.1 堆排序

  堆排序也是选择排序的一种,其特点是,在以后各趟的“选择”中利用在第一趟选择中已经得到的关键字比较的结果。

  堆的定义: 堆是满足下列性质的数列{r1, r2, …,rn}: 或 若将此数列看成是一棵完全二叉树,则堆或是空树或是满足下列特性的完全二叉树:其左、右子树分别是堆,并且当左/右子树不空时,根结点的值小于(或大于)左/右子树根结点的值。

  由此,若上述数列是堆,则r1必是数列中的最小值或最大值,分别称作小顶堆或大顶堆。

  堆排序即是利用堆的特性对记录序列进行排序的一种排序方法。具体作法是:先建一个“大顶堆”,即先选得一个关键字为最大的记录,然后与序列中最后一个记录交换,之后继续对序列中前n-1记录进行“筛选”,重新将它调整为一个“大顶堆”,再将堆顶记录和第n-1个记录交换,如此反复直至排序结束。

  所谓“筛选”指的是,对一棵左/右子树均为堆的完全二叉树,“调整”根结点使整个二叉树为堆。

  堆排序的算法如下所示:

  template

  void HeapSort ( Elem R[], int n ) {

  // 对记录序列R[1..n]进行堆排序。

  for ( i=n/2; i>0; --i )

  // 把R[1..n]建成大顶堆

  HeapAdjust ( R, i, n );

  for ( i=n; i>1; --i ) {

  R[1]←→R;

  // 将堆顶记录和当前未经排序子序列

  // R[1..i]中最后一个记录相互交换

  HeapAdjust(R, 1, i-1);

  // 将R[1..i-1] 重新调整为大顶堆

  }

  } // HeapSort

  其中筛选的算法如下所示。为将R[s..m]调整为“大顶堆”,算法中“筛选”应沿关键字较大的孩子结点向下进行。

  Template

  void HeapAdjust (Elem R[], int s, int m) {

  // 已知R[s..m]中记录的关键字除R[s].key之

  // 外均满足堆的定义,本函数调整R[s] 的关

  // 键字,使R[s..m]成为一个大顶堆(对其中

  // 记录的关键字而言)

  rc = R[s];

  for ( j=2*s; j<=m; j*=2 ) {// 沿key较大的孩子结点向下筛选

  if ( j if ( rc.key >= R[j].key ) break; // rc应插入在位置s上

  R[s] = R[j]; s = j;

  }

  R[s] = rc; // 插入

  } // HeapAdjust

  堆排序的时间复杂度分析:

  1. 对深度为k的堆,“筛选”所需进行的关键字比较的次数至多为2(k-1);

  2.对n个关键字,建成深度为+1)ûlog2nëh(=的堆,所需进行的关键字比较的次数至多为4n;

  3. 调整“堆顶”n-1次,总共进行的关键字比较的次数不超过

  +û2(log2(n-1) + …+log22)ûlog2(n-2)ë

  因此,堆排序的时间复杂度为O(nlogn)

  相关推荐:2010年软件水平考试软件设计师专题讲义汇总

       计算机软考软件设计师练习试题及答案解析汇总

文章搜索
软件水平考试栏目导航
版权声明:如果软件水平考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本软件水平考试网内容,请注明出处。