首页 > 编程语言 >【算法】堆排序

【算法】堆排序

时间:2024-04-04 09:33:00浏览次数:20  
标签:arr 指向 parent int 堆排序 length 算法 child

完全二叉树

在学习堆排序之前,我们先对完全二叉树有一个基本的了解。

构建过程:数据从上到下,从左到右依次进行构建。

我们给出以下数据

 我们构建出以下完全二叉树

我们观察每个节点的下标,会发现以下规律。

 N[i] 的左子树:N[2i+1]

 N[i] 的右子树:N[2i+2]

 N[i] 的父节点:N[(i-1) / 2]

堆排序

堆排序由两部分组成

第一步:由完全二叉树构建大顶堆

大顶堆是在完全二叉树的基础之上,每个节点的值都大于等于孩子节点的值。

首先定义parent游标、child游标。

如果一个节点有子树,那么一定有左子树。

令child = 2*parent + 1

1、让parent游标从后向前移动,直到parent游标有了孩子。

2、让child指向左右孩子当中值最大的那个。

3、让parent指向的值和child指向的值进行对比交换。

4、一旦完成交换,让parent指向child指向的位置,child继续指向左右孩子当中的最大值。

重复执行3、4步,直到parent所指向的值大于child所指向的值或者child指向null。

其中parent不负责向后移动,通过p游标直接跳转。

第二步:堆底元素和堆顶元素互换,堆底不再参与下一轮构建。

以下是堆排序的完整代码

package com.test;

import java.util.Arrays;

public class HeapSort {
	public static void main(String[] args) {
		int[] arr = {59,13,61,48,7,30,76,104,25,12};
		heapSort(arr);
	}
	public static void heapSort(int[] arr) {
		for (int p = arr.length-1; p >= 0; p--) {
			sort(arr, p, arr.length);
		}
		for (int i = arr.length-1; i > 0; i--) {
			int temp = arr[0];
			arr[0] = arr[i];
			arr[i] = temp;
			
			sort(arr, 0, i);
		}
		System.out.println(Arrays.toString(arr));
		
	}
	public static void sort(int[] arr, int parent, int length) {
		int child = 2*parent + 1;
		while(child < length) {
			int rchild = child + 1;
			if (rchild < length && arr[child] < arr[rchild]) {
				child = rchild;
			}
			if (arr[parent] < arr[child]) {
				int temp = arr[parent];
				arr[parent] = arr[child];
				arr[child] = temp;
				
				parent = child;
				child = 2*child + 1;
			}else {
				break;
			}
		}
	}
}

标签:arr,指向,parent,int,堆排序,length,算法,child
From: https://blog.csdn.net/2302_78914800/article/details/137261320

相关文章

  • 面试了微软 bing 应用组大模型算法岗,被自己菜哭了。。。
    节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。合集在这里:《大模型面试宝典》(2024版)正式发......
  • Python常用算法思想--总概篇
    算法的起源:欧几里德的《几何原本》中阐述的求两个数的最大公约数的过程。算法的定义:解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表用系统的方法描述解决问题的策略机制。算法的本质:算法是程序的灵魂,也是衡量一位程序员水平高低的最好参照物。算法的表示方......
  • 神经网络算法:一文搞懂 Self-Attention 和 Multi-Head Attention
    随着Transformer模型的迅速普及,Self-Attention(自注意力机制)和Multi-HeadAttention(多头注意力机制)成为了自然语言处理(NLP)领域中的核心组件。本文将从简要介绍、工作流程、两者对比三个方面,为您解析这两种注意力机制。前期分享一文搞懂Transformer一文搞懂Attent......
  • 神经网络算法:一文搞懂BERT(基于Transformer的双向编码器)
    本文将从BERT的本质、BERT的原理、BERT的应用三个方面,带您一文搞懂BidirectionalEncoderRepresentationsfromTransformers|BERT。GoogleBERT一、BERT的本质BERT架构:一种基于多层Transformer编码器的预训练语言模型,通过结合Tokenization、多种Embeddings和特定任......
  • 数据结构与算法
    1.1数据结构的研究内容程序=数据结构+算法  ———程序的本质 例1:图书管理系统操作对象:若干行数据记录操作算法:查询、插入、删除、修改等操作对象之间的关系:线性关系数据结构:线性数据结构、线性表例2:文件系统的结构图如图可以看到,这是一个典型的树型结构问题,数据......
  • 稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树
    今天的每日一题,感觉理解的还不够深,有待加深理解题型:树、分治、递归链接:894.所有可能的真二叉树-力扣(LeetCode)来源:LeetCode题目描述给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val==0 ......
  • 稀碎从零算法笔记Day36-LeetCode:H指数
    有点绕的一个题,题目描述的有点奇怪(可以看下英文?)题型:数组、模拟链接:274.H指数-力扣(LeetCode)来源:LeetCode题目描述给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数......
  • 编写一个算法来计算 n 阶乘中尾随零的数量
    算法:编写一个算法来计算n阶乘中尾随零的数量解题思路:当n过大时,从1遍历至n,那么会超时,发现以下规律:n!=1*2*3*4*(1*5)*...*(2*5)*...*(3*5)...每隔5个数就会出现一个5,因此我们只需要通过n/5来计算存在存在多少个5个数,那么就对应的存在多少个......
  • 树模型系列——1、决策树算法简介
    1.决策树简介决策树(decisiontree)是机器学习中一种非参数的监督学习算法,可用于分类与回归。其中分类决策树是基于变量特征对离散变量目标值进行分类的,可用于二分类或多分类;回归决策树是基于变量特征对连续变量目标值进行分类的,可用于连续变量的回归拟合。从上图看,可知树形结构......
  • Java最短路径算法知识点(含面试大厂题和源码)
    最短路径算法是计算机科学和图论中的核心问题之一,它旨在找到从一个顶点到另一个顶点或在所有顶点之间的最短路径。这个问题在多种实际应用中都非常重要,如网络路由、交通规划、社交网络分析等。以下是一些与最短路径算法相关的知识点:Dijkstra算法:由荷兰计算机科学家艾兹......