排序算法之堆排序

news2024/11/18 20:48:45

首先在了解堆排序之前我们先来回顾一下什么叫做堆吧!

基本概念

  1. 堆(Heap):是一种特殊的完全二叉树,其中每个节点的值都大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。堆常通过数组来表示,方便快速访问和调整结构。

  2. 大顶堆:堆顶元素(树的根节点)是最大值,适合做降序排序的基础。

  3. 小顶堆:堆顶元素是最小值,适合做升序排序的基础。

让我们简单的来回顾一下大根堆是如何创建的吧!

 这里让我再来为大家解释一下:首先parent指向的是最后一个父亲节点的位置,然后child默认是左孩子树,但是在比较的过程中child会指向左孩子树或者是右孩子树的最大值,然后再与parent下标的值进行比较,这里因为创建的是大根堆,所以,child下标的位置比parent下标的位置大的话那么就需要交换。

那么创建大根堆的代码我就放在下面了

public static int[] createBigHeap(int[] array){
    for (int parent = (array.length-1-1)/2; parent>0; parent--) {
        shifDown(array,parent,array.length);
    }
    return array;
}

private static void shifDown(int[] array,int parent,int end){
    int child = parent*2+1;
    while(child<end){
        if(child+1<end && array[child]<array[child+1]){
            child++;
        }
        if(array[child] > array[parent]){
            swap(array,parent,child);
            parent = child;
            child = parent*2+1;
        } else {
            break;
        }
    }
}

通过上面我们已经了解了什么是堆,那么如何进行堆排序呢?

首先堆排序是一种高效的排序算法,它利用了一种叫做“堆”的特殊数据结构来实现。堆是一个近似完全二叉树,其中每个父节点的值都大于或等于其子节点的值(在大顶堆中)或者小于或等于其子节点的值(在小顶堆中)。

排序阶段包括以下重复步骤,直到整个序列变为有序:

  • 将堆顶元素(即当前最大或最小值)与序列的最后一个元素交换位置。这样,最大值(或最小值)就被放置在了正确的位置(序列的末尾)。
  • 将剩下的元素重新调整为堆,确保去掉一个元素后仍然满足堆的性质。这不包括刚刚被交换到末尾的元素。
  • 重复上述交换和调整堆的过程,每次都将下一个最大(或最小)元素移到已排序部分的末尾。

代码实现:

public static int[] heapsort(int[] array){
    createBigHeap(array);
    int end = array.length-1;
    while(end>=0){
        swap(array,0,end);
        shifDown(array,0,end);
        end--;
    }
    return array;
}

 

时间复杂度:堆排序的平均和最坏情况时间复杂度都是O(n log n),其中n是数组长度。这是因为构建堆的时间复杂度为O(n),而每次调整堆的时间复杂度为O(log n),总共需要调整n-1次。

空间复杂度:堆排序是原地排序算法,除了排序过程中的一些临时变量外,不需要额外的存储空间,因此其空间复杂度为O(1)

稳定性:堆排序是一种不稳定的排序算法,因为在调整堆的过程中相等的元素可能会改变它们的原始相对位置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 组件间的数据绑定

在Vue组件中&#xff0c;v-model指令可以用来实现双向数据绑定。它用于将组件的属性和父组件中的数据进行双向绑定&#xff0c;使得当属性的值改变时&#xff0c;父组件中的数据也会相应地改变&#xff0c;并且当父组件中的数据改变时&#xff0c;属性的值也会相应地改变。 目…

国内各种免费AI聊天机器人(ChatGPT)推荐(中)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐(ChatGPT)专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月29日15点20分 随着人工智能技术的不断发展&#xff0c;AI聊天机器人已经逐渐融入我们的日常生活。它们可以提供各种服务&#xff0c;例如聊天、…

python爬虫实战

import requests import json yesinput(输入页数&#xff1a;) yesint(yes)headers {"accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q0.9","content-type": "application/json",…

文件同步--Resilio Sync

近期有很多文本处理工作&#xff0c;每次通过社交软件发来发去&#xff0c;比较麻烦&#xff0c;还是希望能够自动同步&#xff0c;方便快捷&#xff0c;然后师弟就给我推荐了Resilio Sync&#xff0c;目前配置完毕&#xff0c;使用下来感受良好&#xff0c;mark一下。 特点 跨…

喝汽水问题

问题描述&#xff1a; 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff08;编程实现&#xff09;。解题思路&#xff1a; 变量解释&#xff1a;money总金额数&#xff0c;price汽水单价&#xff0c;excha…

环形列表 题目分析

一、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、思路 1.使用快慢指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;二者相对速度为1 2.当慢指针刚好进入环时&#xff0c;设二者的相对距离为N 3.如果链表中存在环&#xff…

智能私信神器,转化率飙升的秘密!

在当今信息爆炸的时代&#xff0c;企业和商家面临着巨大的竞争压力&#xff0c;如何有效地吸引潜在客户、提高客户转化率成为摆在每一位市场营销人员面前的难题。随着人工智能技术的不断发展&#xff0c;智能私信软件应运而生&#xff0c;为企业提供了一个高效、便捷的解决方案…

【OpenNJet下一代云原生之旅】

OpenNJet下一代云原生之旅 1、OpenNJet的定义OpenNJet架构图 2、OpenNJet的特点性能无损动态配置灵活的CoPilot框架支持HTTP/3支持国密企业级应用高效安全 3、OpenNJet的功能特性4、OpenNJet的安装使用编译安装配置yum源创建符号连接修改配置编译 5、通过 OpenNJet 部署 WEB SE…

[CISCN 2018]sm

目录 1.题目 3.解题 4.参考 1.题目 题目链接 from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long from Crypto.Cipher import AES import hashlib from random import randint def gen512num():order[]while len(order)!512:tmprandint(1,512)if tmp n…

探索小猪APP分发平台:构建高效的应用推广之路

在当今快速发展的移动互联网时代探索小猪APP分发平台&#xff1a;构建高效的应用推广之路&#xff0c;应用分发成为连接开发者与用户的关键桥梁。一个高效的分发平台可以显著提升应用的可达性和用户增长速度。 小猪app分发zixun.ppzhu.net 引言&#xff1a;小猪APP分发平台简介…

Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发

作者&#xff1a;刘军 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。 Spring Cloud Alibaba AI 以 Spring AI 为基础&#xff0c;并在此基础上提供阿里云通义系列大模…

远程桌面报错:【出现验证错误。要求的函数不受支持】

WinR 输入【gpedit.msc】回车 依次打开 计算机配置----管理模板-----系统-----凭据分配---加密数据库修正 选择【已启用】&#xff0c;下拉菜单选择【易受攻击】

phpMyAdmin增加自定义IP登录教程

phpMyAdmin增加自定义IP登录教程 1、打开phpMyAdmin目录&#xff0c; 在此目录下是否有config.sample.inc.php文件&#xff0c;如果存在&#xff0c;那么将其改名为config.inc.php&#xff08;为避免修改失误所造成的损失&#xff0c;强烈建议先备份config.sample.inc.php文件…

笔记85:如何计算递归算法的“时间复杂度”和空间复杂度?

先上公式&#xff1a; 递归算法的时间复杂度 递归次数 x 每次递归消耗的时间颗粒数递归算法的空间复杂度 递归深度 x 每次递归消耗的内存空间大小 注意&#xff1a; 时间复杂度指的是在执行这一段程序的时候&#xff0c;所花费的全部的时间&#xff0c;即时间的总和而空间复…

可视化大屏C位图:智慧场馆/场所图

Hello&#xff0c;我是大千UI工场&#xff0c;本期可视化大屏的焦点图&#xff08;C位&#xff09;分享将场馆作为焦点图的情形&#xff0c;欢迎友友们关注、评论&#xff0c;如果有订单可私信。 智慧场馆是指通过物联网、大数据、人工智能等技术手段&#xff0c;将传统场馆与…

Epinio:Kubernetes 的应用程序开发引擎-加CLI Demo演示

一、解决了什么问题&#xff1f; 开发人员如何专注于代码编写&#xff0c;怎么让他们可以完全忽略k8s基础设施并且和以前在本地Run一个应用一样的体验。 从源码构建一个容器程序 二、解决方案 Introduction | Epinio docs 三、Epinio 的 Kubernetes 的应用程序开发引擎 by Ra…

FFmpeg学习记录(二)—— ffmpeg多媒体文件处理

1.日志系统 常用的日志级别&#xff1a; AV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_DEBUG #include <stdio.h> #include <libavutil/log.h>int main(int argc, char *argv[]) {av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_DEBUG, "hello worl…

怎样建设网站

建设一个网站需要经过一系列的步骤和技术&#xff0c;以下是一个简单的指导&#xff1a; 1. 确定网站目的&#xff1a;首先要确定网站的目的和目标。是为了促销产品&#xff1f;提供信息&#xff1f;还是为了社交交流&#xff1f;确定网站目的可以帮助你更好地规划网站的结构和…

【强训笔记】day8

NO.3 思路&#xff1a;相乘除以最大公约数等于最小公倍数。最小公倍数等于gcd&#xff08;a&#xff0c;a%b&#xff09;递归直到b等于0。 代码实现&#xff1a; #include <iostream> using namespace std;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); }…

MySQL CRUD操作

前言&#x1f440;~ 上一章我们介绍了数据库的一些基础操作&#xff0c;关于如何去创建一个数据库&#xff0c;还有使用数据库&#xff0c;删 除数据库以及对表进行的一些基础操作&#xff0c;今天我们学习CRUD操作 俗称&#xff08;增删改查&#xff09; 如果各位对文章的内…