算法--堆排序学习以及模板

简介:

堆排序学习以及模板


堆排序(Heapsort)是指利用堆这样的数据结构所设计的一种排序算法。

堆积是一个近似全然二叉树的结构。并同一时候满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

1、创建一个堆H[0..n-1](利用MaxHeapify函数从最后一个非叶子节点開始调整堆,如BuildMaxHeap函数调整为大根堆。这个大根堆并不能保证全部的父节点都比子节点大。可是根节点一定是整个堆中最大的)。

2、把堆首(最大值)和堆尾互换(取堆顶元素。由于其总是当前堆中最大或者最小的)

3、把堆的尺寸缩小1,并调用MaxHeapify,目的是使堆顶元素仍然是堆中最大或者最小的(最大还是最小看是大根堆还是小根堆)。

4、反复步骤2,直到堆的尺寸为1




#include <stdio.h>
#include <stdarg.h>

int getParent(int i)      //获取父节点
{
	return (int)(i/2); 
}

int getLeftSon(int i)     //左孩子节点
{
	return (i*2);
}

int getRightSon(int i)    //右孩子节点
{
	return (i*2 + 1);
}

void PrintHeap(int a[], int size,char *msg, ...)
{
	int i;
	va_list ap;
	char buffer[1024];
	
	va_start(ap, msg);      //输出自己定义内容 
	vsnprintf(buffer, 1024, msg, ap);
	va_end(ap);
	
	printf("%s",buffer); 
	
	for(i=1; i<=size; i++)
		printf("%d ",a[i]); 
		
	printf("\n"); 
}

//调整以某个节点i为根节点的子树为大根堆 
void MaxHeapify(int a[], int i, int HeapSize)
{
	int left_son = getLeftSon(i);
	int right_son = getRightSon(i);
	int max_num = i;
	
	if(left_son <= HeapSize && a[left_son] > a[max_num] )
	{
		max_num = left_son;
	}
	
	if(right_son <= HeapSize && a[right_son] > a[max_num])  //两步 找出最大的节点 
	{
		max_num = right_son;
	}
	
	if(max_num != i)
	{
		int temp = a[i];
		a[i] = a[max_num];
		a[max_num] = temp;
		
 		MaxHeapify(a, max_num, HeapSize);	
	}
}

//首先将一个无序数组 组建成为一个大根堆 
void BuildMaxHeap(int a[], int size)
{
	int i;
	
	for(i=(int)(size/2); i>0; i--)   //从最后一个非叶子节点開始往前递归 
	{
		MaxHeapify(a, i, size);	
	}
	
	PrintHeap(a, size, "Build a Big root Heap %d:",size); 
}

//先建一个大根堆  然后从后往前取最大的数(根节点肯定是当前堆中最大的数 每次堆大小减一) 
void HeapSort(int a[], int size)
{
	int i;
	
	BuildMaxHeap(a, size);
	
	for(i=size; i>1; i--)
	{
		int temp = a[i];         //获取当前堆中最大的数 
		a[i] = a[1];
		a[1] = temp;
		
		MaxHeapify(a, 1, i-1);
		PrintHeap(a, i-1, "This is in Heap sorting:"); 
	}
} 


int main()
{
	//从1開始 建堆 
	int Array[] = {0, 6, 8, 4, 10, 2, 5, 7, 1, 3, 9}; 
	
	HeapSort(Array, 10);
	
	PrintHeap(Array, 10, "After Heap Sort, Array is:"); 
	
	return 0;
} 

执行结果:



參考网址:

http://blog.csdn.net/zjf280441589/article/details/38589353

http://blog.csdn.net/xiajun07061225/article/details/7602979





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5339903.html,如需转载请自行联系原作者

相关文章
|
6月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
7月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
154 8
算法系列之排序算法-堆排序
|
6月前
|
算法 安全 搜索推荐
套用算法模板备案审核问题增多的原因及解决建议
随着算法备案要求的完善,企业常因使用网上廉价模板而遭遇审核通过率低、问题增多的困境。本文分析了审核不通过的原因,包括模板缺乏针对性、审核标准严格、审核人员主观差异及企业准备不足等,并提出建议:深入了解备案要求、准备详尽材料、避免通用模板、寻求专业帮助。备案后还需持续合规管理,确保算法服务安全运行。
|
8月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
1724 11
架构学习:7种负载均衡算法策略
|
10月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
11月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
448 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
11月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
492 2
动态规划算法学习三:0-1背包问题
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
10月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
10月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明

热门文章

最新文章