堆排序学习以及模板

堆排序学习以及模板

堆排序(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

时间: 2024-07-30 05:03:56

堆排序学习以及模板的相关文章

AngularJS学习---更多模板(More Templating) step 8

1.切换分支 [email protected]:~/develop/angular-phonecat$ git checkout step-8 #切换分支 [email protected]-pc:~/develop/angular-phonecat$ npm start #启动项目 2.需求: 将step 7 中的手机详细信息展示出来,加上各种参数配置,图片展示等等. 3.效果: 这里很明显要比step 7中的信息详细的多,而且效果要好很多.究竟是怎么实现的呢? 3.实现代码: 首先,所有需

django学习之模板系统

django模板系统学习笔记之for 在for标签里面,有以下知识点: forloop.counter forloop.counter0 forloop.first forloop.last forloop.revcounter forloop.revcounter0 froloop.parentloop empty 下面我们举例学习: 首先到我们的工程目录下,敲入: python manage.py shell # forloop.counter from django.template im

Effective C++ Item 43 学习处理模板化基类内的名称

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:可在derived class templates 内通过 "this->" 指涉 base class templates 内的成员名称,或藉由一个明白写出的 "base class 资格修饰符"完成. 示例: class CompanyA{ public: //... void sendCleartext(const std::string &

opengl学习-利用模板测试勾画物体轮廓中出现的一个问题

我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glClear(GL_STENCIL_BUFFER_BIT);没有起作用,原来 我在while的末尾忘记了修改回来模板缓冲区为可写.glStencilMask(0xff); 原文地址:https://www.cnblogs.com/pixs-union/p/8184366.html

vue.js 学习之模板语法详解

本文和大家分享的主要是vue.js 的模板语法,希望对大家学习vue.js有所帮助,一起来看看吧. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析. 在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数.结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上. 如果你熟悉虚拟 D

[Flask]学习杂记--模板

这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是jinja2 模板,和django自带的模板很类似,但又比django的模板强大,提供了更多有用的工具,基本使用上基本都是一致的. 写了一个小案例,把模板渲染的基本步骤和变量传递的基本使用练习了下. jinjia2 模板文档 http://jinja.pocoo.org/docs/dev/ flas

学习C++模板,初体验

最近,看了很多码神级人物的代码,发现其代码很炫酷,尤其对模板的使用,作为小码农,感觉已经落伍了,所以应该发奋图强,好好学习和掌握模板这个东西. 模板是什么呢?有人说一个模板就是一个创建类或函数的蓝图或者公式,什么意思呢?就是说模板是创建类或者函数的母体或生成器,你给一些参数,模板就能够创建出一个类或者函数. 那么模板怎么定义呢?模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或者多个模板参数,用<>包围起来.for example: template <

堆排序-学习笔记

在学习堆排序之前首先了解一下二叉堆的特性: 1.二叉堆的父节点的值总是大于等于(或小于等于)其左右孩子的值: 2.每个节点的左右子树都是一棵这样的二叉堆. 如果该二叉堆的父节点总是大于孩子节点,则叫做最大堆,如果父节点小于孩子节点,则叫做最小堆. 在堆排序的应用中,如果递增排序,则应该使用最大堆,反之,使用最小堆. 堆排序是不稳定的 堆排序主要有两个步骤来完成堆排序: 1.把一个无序数列构造成一个最大堆或最小堆: 2.去掉根节点(堆顶元素),把剩下的元素重新构造一个二叉堆. 二叉堆的存储结构为一

django 学习-2 模板

如何使用渲染模板的方法来显示内容. 1.创建一个项目dream django-admin.py   startproject   dream cd  dream    再创建一个应用 python manage.py  startapp  learn 2.把创建的应用-learn加入到 settings.INSTALLED_APPS中 INSTALLED_APPS = (     'django.contrib.admin',     'django.contrib.auth',     'dj