当前位置: 首页 > news >正文

垣曲做网站企业网站建设

垣曲做网站,企业网站建设,templates翻译,wordpress标签库 导入目录 11.7 堆排序 11.7.1 算法流程 11.7.2 算法特性 11.7 堆排序 Tip 阅读本节前,请确保已学完“堆“章节。 堆排序(heap sort)是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”…

目录

11.7   堆排序

11.7.1   算法流程

11.7.2   算法特性


11.7   堆排序

Tip

阅读本节前,请确保已学完“堆“章节。

堆排序(heap sort)是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序。

  1. 输入数组并建立小顶堆,此时最小元素位于堆顶。
  2. 不断执行出堆操作,依次记录出堆元素,即可得到从小到大排序的序列。

以上方法虽然可行,但需要借助一个额外数组来保存弹出的元素,比较浪费空间。在实际中,我们通常使用一种更加优雅的实现方式。

11.7.1   算法流程

设数组的长度为 𝑛 ,堆排序的流程如图 11-12 所示。

  1. 输入数组并建立大顶堆。完成后,最大元素位于堆顶。
  2. 将堆顶元素(第一个元素)与堆底元素(最后一个元素)交换。完成交换后,堆的长度减 1 ,已排序元素数量加 1 。
  3. 从堆顶元素开始,从顶到底执行堆化操作(sift down)。完成堆化后,堆的性质得到修复。
  4. 循环执行第 2. 步和第 3. 步。循环 𝑛−1 轮后,即可完成数组排序。

Tip

实际上,元素出堆操作中也包含第 2. 步和第 3. 步,只是多了一个弹出元素的步骤。

heap_sort_step11

图 11-12   堆排序步骤

在代码实现中,我们使用了与“堆”章节相同的从顶至底堆化 sift_down() 函数。值得注意的是,由于堆的长度会随着提取最大元素而减小,因此我们需要给 sift_down() 函数添加一个长度参数 𝑛 ,用于指定堆的当前有效长度。代码如下所示:

heap_sort.c

/* 堆的长度为 n ,从节点 i 开始,从顶至底堆化 */
void siftDown(int nums[], int n, int i) {while (1) {// 判断节点 i, l, r 中值最大的节点,记为 maint l = 2 * i + 1;int r = 2 * i + 2;int ma = i;if (l < n && nums[l] > nums[ma])ma = l;if (r < n && nums[r] > nums[ma])ma = r;// 若节点 i 最大或索引 l, r 越界,则无须继续堆化,跳出if (ma == i) {break;}// 交换两节点int temp = nums[i];nums[i] = nums[ma];nums[ma] = temp;// 循环向下堆化i = ma;}
}/* 堆排序 */
void heapSort(int nums[], int n) {// 建堆操作:堆化除叶节点以外的其他所有节点for (int i = n / 2 - 1; i >= 0; --i) {siftDown(nums, n, i);}// 从堆中提取最大元素,循环 n-1 轮for (int i = n - 1; i > 0; --i) {// 交换根节点与最右叶节点(交换首元素与尾元素)int tmp = nums[0];nums[0] = nums[i];nums[i] = tmp;// 以根节点为起点,从顶至底进行堆化siftDown(nums, i, 0);}
}

11.7.2   算法特性

  • 时间复杂度为 𝑂(𝑛log⁡𝑛)、非自适应排序:建堆操作使用 𝑂(𝑛) 时间。从堆中提取最大元素的时间复杂度为 𝑂(log⁡𝑛) ,共循环 𝑛−1 轮。
  • 空间复杂度为 𝑂(1)、原地排序:几个指针变量使用 𝑂(1) 空间。元素交换和堆化操作都是在原数组上进行的。
  • 非稳定排序:在交换堆顶元素和堆底元素时,相等元素的相对位置可能发生变化。
http://www.zhongyajixie.com/news/27650.html

相关文章:

  • 做网站所需技术网站服务器查询工具
  • 平台网站建设报价无锡哪里有做网站的
  • 做网站优化排名百度推广退款投诉
  • 无锡做网站需要多少钱广告免费发布信息
  • 免费建立手机网站吗semir森马
  • 导航网站建设金华网站推广
  • 广东确诊病例最新消息百度关键词优化平台
  • 武汉市城乡建设委网站活动推广方式都有哪些
  • 盘锦网站制作培训心得总结
  • 建设独立网站需要什么时候外贸平台有哪些
  • 推广网站站群网络推广合同
  • 政府网站建设新媒体指标一键搭建网站工具
  • 珠海网站建设及优化网络推广方案设计
  • 张家口做网站的销售平台排名
  • 英迈思做网站做的怎样电销系统
  • 重庆潼南网站建设公司电话网页设计教程
  • 封开网站建设公司石家庄seo培训
  • 美国做电商网站百度seo高级优化
  • 云建站步骤北京营销网站制作
  • 怎么做建设网站丹东seo推广优化报价
  • 有没有专门做教育培训的网站百度一下网页首页
  • 上海做网站企业网站建设的技术支持
  • 大连网站优化方案百度问答seo
  • 网站建设 网络科技智慧软文发稿平台官网
  • 杭州网站建设制作公司北京seo如何排名
  • 中山网站建设工具猫百度广告联盟点击一次多少钱
  • 网站建设的通知网站维护分工免费域名注册查询
  • wordpress发表文章seo是什么意思中文
  • 网站模板 红色输入关键词自动生成文章
  • 北京市西城区住房建设局官方网站长沙seo网站优化