数据结构第九天(堆排序)

目录

前言

概述

源码:

主函数:

运行结果:

其他



前言

哈哈,这个堆排序算法很久之前就已经敲过一遍了,时间一久,思路有点淡忘。今天重新看过一遍之后,又亲自撸代码,幸运的是,代码运行一次就成功了,没有任何逻辑错误而且结果也达到了预期效果。

在最后,与大家共勉:你所走的每一步路,都算数。

概述

堆排序(Heap Sort)是一种基于比较的排序算法,使用二叉堆(Binary Heap)数据结构来帮助实现其排序过程。二叉堆可以被视为一颗完全二叉树,其中每个节点的值都不大于(或不小于)其子节点的值,这样的二叉堆分别称为最大堆(Max Heap)和最小堆(Min Heap)。堆排序主要包括两个步骤:建堆(构造初始堆)和调整堆。

1. 建堆(构造初始堆)

首先,将待排序的序列构造成一个最大堆,即所有父节点的值都大于或等于子节点的值。这一步的目的是选出最大的元素(位于根节点),准备将它与序列的末尾元素交换。

建堆的过程从最后一个非叶子节点开始,向前逐个对每个父节点进行调整,确保每个父节点的值都大于其子节点的值。最后一个非叶子节点的位置可以通过序列长度计算得出,设序列长度为n,则最后一个非叶子节点的位置是n/2 - 1(假定序列的起始索引为0)。

2. 调整堆

将最大堆的根节点(即当前最大值)与最后一个元素交换,然后减少堆的大小,对新的根节点执行下沉操作,以重新满足最大堆的性质。重复这个过程,直到堆的大小为1,排序完成。

下沉操作指的是将新的根节点值与其子节点中较大者交换,直到该节点值大于其子节点或已经到达叶子节点。

堆排序的算法步骤

  1. 建立最大堆:从最后一个非叶子节点开始,向上进行调整,确保每个父节点都大于其子节点。
  2. 排序
    • 将根节点(最大值)与最后一个元素交换,此时序列的最后部分已经是排序好的。
    • 减少堆的大小(排除已排序的部分),对新的根节点进行下沉操作,以维护最大堆的性质。
    • 重复上述过程,直到堆的大小为1。

时间复杂度

  • 最好、最坏、平均情况下的时间复杂度均为O(n log n)。
  • 堆排序的空间复杂度为O(1),因为它是原地排序算法。

特点

  • 不稳定排序:相同的元素可能会因为堆调整过程而改变其相对位置。
  • 原地排序:不需要额外的存储空间。

堆排序是一种高效的排序算法,尤其适用于数据量大的情况。由于其在最坏情况下也能保持O(n log n)的时间复杂度,因此是一种非常可靠的排序方法。

源码:

void heapAdjust(int* dest,  unsigned int dataCnt)
{unsigned int head = dataCnt;head /= 2;if (head * 2 + 1 == dataCnt){if (*(dest + head * 2) > *(dest + head * 2 - 1)){if (*(dest + head - 1) > *(dest + head * 2 - 1)){swap(*(dest + head - 1), *(dest + head * 2 - 1));}}else if (*(dest + head - 1) > *(dest + head * 2)){swap(*(dest + head - 1), *(dest + head * 2));}}else{if (*(dest + head -1) > *(dest + head * 2 - 1)){swap(*(dest + head - 1), *(dest + head * 2-1));}}for (int i = dataCnt/2-1; i > 0; --i){head = i;if (*(dest + head * 2) > *(dest + head * 2 - 1)){if (*(dest + head - 1) > *(dest + head * 2 - 1)){swap(*(dest + head - 1), *(dest + head * 2 - 1));}}else if (*(dest + head - 1) > *(dest + head * 2)){swap(*(dest + head - 1), *(dest + head * 2));}}}
void sortByHeapSort(int* dest, const unsigned int dataCnt)
{for (int i = 0; i < dataCnt; ++i){heapAdjust(dest + i, dataCnt - i);}
}

主函数:

#include<stdio.h>
#include<iostream>
using namespace std;
#include"dataStructAPI.h"
#include"sort.h"
#include<windows.h>
int main()
{

int array[16] = { 0 };
    numberProducer.getFilledArray(array,16);
    cout << "  原 始 数 据   :";
    numberProducer.showArray(array,16);


    sortByHeapSort(array, 16);
    cout << "   堆 排 序 后  :";
    numberProducer.showArray(array, 16);


    sortBySelectSort(array, 16);
    cout << "选 择 排 序 后  :";
    numberProducer.showArray(array, 16);

    sortByQuickSort(array, 16);
    cout << "快 速 排 序 后  :";
    numberProducer.showArray(array, 16);

    sortByBubbleSort(array, 16);
    cout << "冒 泡 排 序 后  :";
    numberProducer.showArray(array, 16);

    sortByShellInsert(array, 16, 3);
    cout << "希尔插入排序后  :";
    numberProducer.showArray(array, 16);

    sortByBinarySearchInsert(array, 16);
    cout << "折半插入排序后  :";
    numberProducer.showArray(array, 16);

    sortByDirectInsert(array, 16);
    cout << "直接插入排序后  :";
    numberProducer.showArray(array, 16);
    
    system("pause");
    return 0;
}

运行结果:

其他

数据结构第一天(生成1000以内的随机数自动填充数组)

数据结构第二天(直接插入排序/内存申请/指针操作)

数据结构第三天(折半插入排序)

数据结构第四天(希尔排序)

数据结构第五天(冒泡排序)

数据结构第六天(快速排序)

数据结构第七天(简单选择排序)

数据结构第八天(归并排序)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/457752.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven详细配置整理

Maven的作用 在Javaweb开发中&#xff0c;需要使用大量的jar包&#xff0c;需要手动去导入&#xff0c;Maven能够自动帮我们导入和配置这个jar包。 对于新手Maven就是用来方便导入jar包的&#xff01; Maven的核心思想&#xff1a;约定大于配置 有约束&#xff0c;不要去违…

计算机网络——网络

计算机网络——网络 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.cn/qianqiu) 无线网络和移动网…

LLaVA:GPT-4V(ision) 的新开源替代品

LLaVA&#xff1a;GPT-4V(ision) 的新开源替代品。 LLaVA &#xff08;https://llava-vl.github.io/&#xff0c;是 Large Language 和Visual A ssistant的缩写&#xff09;。它是一种很有前景的开源生成式 AI 模型&#xff0c;它复制了 OpenAI GPT-4 在与图像对话方面的一些功…

Vue中对虚拟DOM的理解

作为现代前端开发中的主流框架之一&#xff0c;Vue.js是一个非常流行的JavaScript框架&#xff0c;其核心概念之一就是虚拟DOM&#xff08;Virtual DOM&#xff09;。在本篇文章中&#xff0c;我们将深入探讨Vue中虚拟DOM的概念&#xff0c;并讨论为什么它在前端开发中如此重要…

MoE-LLaVA:具有高效缩放和多模态专业知识的大型视觉语言模型

视觉和语言模型的交叉导致了人工智能的变革性进步&#xff0c;使应用程序能够以类似于人类感知的方式理解和解释世界。大型视觉语言模型(LVLMs)在图像识别、视觉问题回答和多模态交互方面提供了无与伦比的能力。 MoE-LLaVA利用了“专家混合”策略融合视觉和语言数据&#xff0…

Python(20)正则表达式(Regular Expression)中常用函数用法

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 正文 正则表达式 粗略的定义&#xff1a;正则表达式是一个特殊的字符序列&#xff0c;帮助用户非常便捷的检查一个字符串是否符合某种模…

python-自动化篇-办公-一键将word中的表格提取到excel文件中

文章目录 代码 工作中&#xff0c;经常需要将Word文档中的表格粘贴到Excel文件中&#xff0c;以便汇总及分析。一个一个复制粘贴&#xff0c;非常不方便&#xff0c;还是Python自动化操作&#xff0c;省心省力。要求如下图所示&#xff0c;即将word中的所有表格&#xff0c;转存…

【python错误】Pytorch1.9 ImportError: cannot import name ‘zero_gradients‘

错误&#xff1a;Pytorch1.9 ImportError: cannot import name ‘zero_gradients’ 错误提示&#xff1a; ImportError: cannot import name ‘zero_gradients’ from ‘torch.autograd.gradcheck’ (/root/miniconda3/envs/d2l/lib/python3.9/site-packages/torch/autograd/g…

护眼灯的色温标准是什么?护眼灯参数标准介绍

选择合适的护眼台灯不仅能提升家居的品质&#xff0c;还能为我们的生活增添一份温馨与舒适。不过有些色温调节不当不仅不能达到很好的学习效率&#xff0c;还容易打瞌睡&#xff0c;甚至伤眼睛的情况也有可能出现&#xff0c;那么什么色温有什么标准呢&#xff1f; 一、合适的…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】【Exercise Solution】

说明&#xff1a; 个人资料&#xff0c;仅供学习使用&#xff0c;版权归校方所有。 一、题目描述 该问题接上期博文【练习题及解答】&#xff0c;描述网络通信中的链路效率&#xff08;Link Efficiency&#xff09;&#xff0c;即Link Utilization的计算。&#xff08;此处认…

Linux下库函数、静态库与动态库

库函数 什么是库 库是二进制文件, 是源代码文件的另一种表现形式, 是加了密的源代码; 是一些功能相近或者是相似的函数的集合体. 使用库有什么好处 提高代码的可重用性, 而且还可以提高程序的健壮性;可以减少开发者的代码开发量, 缩短开发周期. 库制作完成后, 如何给用户…

YUM | 包安装 | 管理

YUM 功能 软件包安装&#xff1a; 通过yum命令安装软件包。例如&#xff0c;安装一个名为 example-package 的软件包 yum install example-package更新包 检查更新&#xff1a; 检查可用更新&#xff1a; sudo yum check-update <package_name>软件包更新&#xff1a; y…