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

排序--堆排序【图文详解】

二叉树的相关概念

  • 叶子:没有子节点的节点叫叶子节点

  • 大根堆:所有的父亲大于儿子

  • 小根堆:所有的儿子大于父亲

  • 父亲于儿子的的下标关系

    父亲的下标为i ,那么左孩子的下标为2*i+1,右孩子的下标为2i+2

    子的下标是i ,父的下标为(i-1)/2

构建大根堆的方法

  • 从最后一棵子树开始,从后往前调整;
  • 每次调整,从上往下; 调整为大根堆;

图解

在这里插入图片描述

完整代码

void  HeapAdjust(int* arr, int start, int end)//堆调整,从倒数第二层开始调整
{
	int  tmp = arr[start];//先把start的值保存下来,要不然丢失数据
	//先找左孩子,2*strat+1,
	for (int i = 2 * start + 1; i <= end; i = 2 * i + 1)
	{
		//把i定位为左右孩子的最大值下标
		if (i < end && arr[i] < arr[i + 1])//有右孩子,并且左孩子的值小于右孩子
		{
			i++;
		}//i一定是左右孩子的最大值
		//找到左右孩子的最大值后
		if (arr[i] > tmp)
		{
			arr[start] = arr[i];//把左右孩子的最大值给strat
			start = i;//start赋值为i
		}
		else
		{
			break;//如果越界,跳出循环
		}
	}
	arr[start] = tmp;//最后把原来start的值给补上
}

void   HeapSort(int* arr, int len)//堆排序,O(nlogn),O(1),不稳定
{
	int i;//数组下标
	//第一次建立大根堆,从后往前,多次调整   
	//子是i,父是(子-1)/2
	for (i = (len - 1 - 1) / 2; i >= 0; i--)//O(n)数学证明
	//这个i是倒数第二层根的下标,比如说有11个数字,那么要从4下标开始调整
	{
		HeapAdjust(arr, i, len - 1);//第一次建立大根堆
		//这里的len-1,不影响调整,放大了不影响

	}
	//每次将0下标的数字和待排序的最后一个交换,然后再次调整  堆调整的时间复杂度是logn
	int  tmp;//临时变量
	for (i = 0; i < len - 1; i++)  //O(nlogn)  11个数字交换10次    
	{
		//交换    
		tmp = arr[0];    
		arr[0] = arr[len - 1 - i];//len-1-i是因为调整好了的数字不要再动了    
		arr[len - 1 - i] = tmp;    

		//再次调整    
		HeapAdjust(arr, 0, len - 1 - i - 1);//堆调整    
		//len-1-i-1的解释:len-1-i是要交换的数字,交换完的数字不需要再参加调整    
	}
}

建立大根堆的时间复杂度:O(n) 堆调整的时间复杂度是O(logn)

时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定


本篇完!🍗


http://www.kler.cn/a/322610.html

相关文章:

  • spi 回环
  • ISCTF 2024 web
  • 【ARM】MDK在debug模式下的Registers窗口包含哪些内容
  • 刘艳兵-DBA036-Oracle数据库中的触发器(Trigger)可以在以下哪种情况下自动执行?
  • 创建vue3项目步骤
  • InfluxDB时序数据库笔记(一)
  • C++入门day5-面向对象编程(终)
  • 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)
  • Oracle 启动对应数据库实例数据库方法
  • Golang优雅关闭gRPC实践
  • 【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)
  • 短剧向左,体育向右,快手前途未卜?
  • Python爬虫之urllib模块详解
  • 通过 GitLab API 实现 CHANGELOG.md 文件的自动化上传至指定分支
  • GS-SLAM论文阅读笔记--GLC-SLAM
  • 3D建模:Agisoft Metashape Professional 详细安装教程分享 Mac/win
  • Word:表格公式计算
  • 单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理
  • string类模拟实现
  • 4.V2X技术
  • 前端开发之装饰器模式
  • 将图片资源保存到服务器的盘符中
  • LLaMA-Factory 使用 sharegpt 格式的数据集
  • nacos 快速入门
  • 【如何学习操作系统】——学会学习的艺术
  • 简单上手vue使用vue-plugin-hiprint进行打印