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

排序算法-堆积树排序法(HeapSort)

目录

排序算法-堆积树排序法(HeapSort)

1、说明

2、算法分析

3、C++代码 


排序算法-堆积树排序法(HeapSort)

1、说明

堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序时间。堆积排序法用到了二叉树的技巧,是利用堆积树来完成排序的。堆积树是一种特殊的二叉树,可分为最大堆积树和最小堆积树两种。

最大堆积树满足以下3个条件:

  1. 它是一棵完全二叉树。
  2. 所有节点的值都大于或等于它左右子节点的值。
  3. 树根是堆积树中最大的。

最小堆积树具备以下3个条件:

  1. 它是一棵完全二叉树。
  2. 所有节点的值都小于或等于它左右子节点的值。
  3. 树根是堆积树中最小的。

2、算法分析

  1. 在所有情况下,时间复杂度均为O(nlog_{2}n)
  2. 堆积排序法不是稳定排序法。
  3. 只需要一个额外的空间,空间复杂度为O(1)

3、C++代码 

#include<iostream>
#include<iomanip>
using namespace std;

void Print(int* data, int size) {
	for (int i = 1; i < size; i++)
		cout << "[" << setw(2) << data[i] << "] ";
	cout << endl;
}

void Swap(int& i, int& j) {
	int temp = i;
	i = j;
	j = temp;
}

void ad_heap(int* data, int i, int size) {
	int j = 2 * i;
	int temp = data[i];
	int post = 0;
	while (j <= size && post == 0){
		if (j < size) {
			if (data[j] < data[j + 1])
				j++;
		}
		if (temp >= data[j])
			post = 1;
		else {
			data[j / 2] = data[j];
			j *= 2;
		}
	}
	data[j / 2] = temp;
}


void Heap(int* data, int size) {
	for (int i = (size / 2); i > 0; i--)
		ad_heap(data, i, size - 1);

	for (int i = size - 2; i > 0; i--) {
		Swap(data[1], data[i + 1]);
		ad_heap(data, 1, i);
	}
}

int main() {
	int data[9] = { 0,5,6,4,8,3,2,7,1 };
	int size = 9;
	cout << "原始数据:";
	Print(data, size);
	Heap(data, size);
	cout << "排序结果:";
	Print(data, size);

	return 0;
}

输出结果 


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

相关文章:

  • 【C++】类与对象的基础概念
  • Spark 的容错机制:保障数据处理的稳定性与高效性
  • 【go从零单排】Random Numbers、Number Parsing
  • 【Elasticsearch入门到落地】1、初识Elasticsearch
  • 运行springBlade项目历程
  • DHCP与DNS安全管理
  • SQL企业微信群机器人消息推送
  • 关于数据中台的理解和思考
  • 实战经验分享FastAPI 是什么
  • Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(上)
  • react-antd组件 input输入框: 实现按回车搜索
  • 密码学与网络安全:量子计算的威胁与解决方案
  • 038-第三代软件开发-简易视频播放器-自定义Slider (二)
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性
  • 聚观早报 |2024款飞凡R7官宣;小米14新配色材质
  • Spark新特性与核心概念
  • 网络(番外篇)can网络知识
  • VScode 调试 linux内核
  • 【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘
  • SQL Server Management Studio (SSMS)的安装教程
  • MongoDB的安装
  • 【黑马程序员】mysql进阶再进阶篇笔记
  • 2M大小的PDF文档上传到LangChain-ChatGLM知识图谱中,大致需要的时间
  • 网络协议--TCP的成块数据流
  • C++单调向量算法应用:所有子数组中不平衡数字之和
  • 【ARM Coresight 系列文章19.2 -- Cortex-A720 AMU 详细介绍】