关闭

堆排序的实现

153人阅读 评论(0) 收藏 举报
分类:

/**
* @file BinaryHeap.hpp
* @brief 二叉堆
* 
* @author xiao2 joyjj0218@qq.com 
* @version 1.0 
* @date 2015.11.17 
*/


#ifndef BINARYHEAP_HPP_
#define BINARYHEAP_HPP_


#include <vector>
#include <algorithm>


using namespace std;


/**
* @brief 算法
*/
namespace algorithm
{
/**
* @brief 二叉堆模板类
*/
template <typename comparable>
class BinaryHeap
{
public:
	/**
	* @brief 二叉堆构造函数
	* @param[in] item 输入二叉堆的vector序列
	*/
	explicit BinaryHeap(vector<comparable> &item) :
	m_vecArray(item), m_iSize(m_vecArray.size())
	{
	}

public:
	/**
	* @brief 建立最小堆
	* @param[in] current_size 当前堆大小
	* @return void
	*/
	void BuildHeap(int current_size)
	{
		for(int i = current_size / 2 - 1 ; i >= 0; i--)  // 从最后一个叶子节点的父节点开始
			PercolateDown(i, current_size);  // 渗透下沉
	}

	/**
	* @brief 堆排序
	* @return void
	*/
	void HeapSort()
	{
		for(int i = m_iSize; i > 0; i--) {  // 从最后一个节点开始
			BuildHeap(i);  // 建立堆,堆的大小在删除堆顶元素后递减1
			swap(m_vecArray[0], m_vecArray[i-1]);  // 堆顶元素(最小值)与堆尾元素交换(即删除堆顶元素)
		}
	}

private:
	/**
	* @brief 渗透下沉
	* @param[in] current 当前下沉索引(索引从0开始)
	* @param[in] current_size 当前下沉序列大小
	* @return void
	*/
	void PercolateDown(int current, int current_size)
	{
		int parent;
		int child;

		parent = current;  // 当前下沉位置作为父节点
		comparable temp = m_vecArray[current];  // 保存下沉初始值

		for( ; (2 * parent + 1) < current_size; ) {  // 左子节点索引小于当前下沉序列大小
			child = 2 * parent + 1;  // 左子节点索引

			if(child < current_size - 1 && m_vecArray[child+1] < m_vecArray[child])  // 如果有右子节点(即左子节点兄弟节点)且右子节点小于左子节点
				child++;  // 右子节点索引

			if(m_vecArray[child] < temp) {  // 如果左(右)子节点小于父节点
				m_vecArray[parent] = m_vecArray[child];  // 较小的子节点替换父节点
				parent = child;  // 父节点下沉到较小的子节点
			} else {
				break;  // 满足二叉堆性质,退出
			}
		}
		m_vecArray[parent] = temp;  // 下沉初始值填充最后一个替换节点
	}

private:
	vector<comparable> &m_vecArray;  ///< 输入vector数组的引用(索引从0开始)
	int m_iSize;  ///< vector数组的大小
};
}


#endif  // BINARYHEAP_HPP_

0
0
查看评论

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 18:34
  • 8256

堆排序原理及其实现(C++)

堆排序原理及其实现(C++)1 堆排序的引入 我们知道`简单选择排序`的时间复杂度为O(n^2),熟悉各种排序算法的朋友都知道,这个时间复杂度是很大的,所以怎样减小简单选择排序的时间复杂度呢?从上文分析中我们知道简单选择排序主要操作是进行关键字的比较,所以怎样减少比较次数就是改进的关键。 简单选...
  • yanglr2010
  • yanglr2010
  • 2016-10-18 21:48
  • 3185

堆排序的实现-C语言

堆 堆是一个完全二叉树的数组对象。树每一层都是满的,最后一层可能除外(从一个节点的左子树开始填)。 给定节点 i ,可以很容易计算父节点和子节点的位置。 Parent(i) =floor(i/2)   :i/2再向下取整 LeftChild(i) =2*(i+1)-1...
  • caimo
  • caimo
  • 2012-07-25 12:08
  • 16795

实现堆排序

实现堆排序      1. 堆排序的思想      堆是一棵完全二叉树,任何一个节点的val不大于(最小堆)或者不小于(最大堆)其左右孩子节点的关键字。     以最大堆为例,堆排序的基本思想是: 1)将初始待排...
  • puqutogether
  • puqutogether
  • 2015-01-27 15:51
  • 907

HeapSort堆排序Java实现图文代码详解

堆排序(Heapsort)堆积树设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。 排序图如下:(gif来自维基百科) 堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最后个元素替换位置,heapsize减一,重新调整堆变成大根堆。重复上面操作直到heapsize等于一...
  • wg1033755123
  • wg1033755123
  • 2015-04-12 14:04
  • 769

堆排序分析及优化

堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大,具体算法步骤如下。 一、创建堆         首先将数组中的元素调整成堆,对应下面程序中的createHeap(List list)方法。创建堆就是从树中最后一个内节点(下...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015-04-09 15:21
  • 1447

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。分为最大堆和最小...
  • kimylrong
  • kimylrong
  • 2013-12-05 22:25
  • 53290

顺序表上实现堆排序

堆排序 (1)定义顺序表的存储结构; (2)在顺序表上实现堆排序; (3)用大量的数据测试最好、最坏和平均情况下的排序速度。 #include #include #include using namespace std; //定义顺序表的存储结构; typedef struct { ...
  • migu77777
  • migu77777
  • 2016-12-17 21:41
  • 285

利用Python实现堆排序

在这里要事先说明一下我也是新手,很多东西我了解不是很深入,写算法完全是锻炼自己逻辑能力同时顺带帮助读研的朋友么解决一些实际问题。所以很多时候考虑的东西不是很全面能请各位看到博文的大牛们指正。对于排序算法说实在的我觉得已经写烂了,但是为什么还是要过一遍呢?还是为了能够打牢基础。说一下自己的看法,对于已...
  • minxihou
  • minxihou
  • 2016-07-07 11:41
  • 4868

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大于等于其左、右孩子的值,这样的堆称为大根堆; 二、要点 1.将数组构造成初始堆(若想升序则建立...
  • qq_21492635
  • qq_21492635
  • 2017-06-12 14:23
  • 513
    个人资料
    • 访问:46908次
    • 积分:707
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:46篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论