现在的位置: 首页 > 综合 > 正文

堆的相关算法

2017年12月07日 ⁄ 综合 ⁄ 共 1505字 ⁄ 字号 评论关闭

堆是一种特殊的二叉树,它具有以下两个性质:

1、每个节点的值大于或等于其每个子节点的值;

2、该树完全平衡,最后一层的叶子都处于最左侧的位置。

有最大堆和最小堆之分,以上定义是最大堆的定义,最小堆的定义如下:

1、每个节点的值小于或等于其每个子节点的值;

2、该树完全平衡,最后一层的叶子都处于最左侧的位置。

本文实现了堆的建立、删除、插入、堆排序。

本文中的例子以最大堆为例:

// heap_function.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void swap(int *p, int *q)
{
	int temp = *p;
	*p = *q;
	*q = temp;
}

void MoveUp(int heap[],int start)//向上移动的操作,用于向堆中插入元素用//
{
	int i = start;
	int j = (i -1)/2;
	while(i>0)
	{
		if (heap[i] > heap[j])
		{
			swap(&heap[i],&heap[j]);
			i = j;
			j = (i-1)/2;
		}
		else
			break;
	}
}

void insert_ele(int heap[], int value, int &count)//向堆中插入元素,count为堆中元素的个数,//
{
	heap[count] = value;
	MoveUp(heap,count);
	count++;
}

void MoveDown(int heap[], int first, int last)
{
	int largest = 2*first+1;
	while(largest<= last)
	{
		if (largest<last && heap[largest] < heap[largest+1])
			largest = largest + 1;
		if (heap[largest] > heap[first])
		{
			swap(&heap[largest], &heap[first]);
			first = largest;
			largest = 2* largest + 1;
		}
		else 
			largest = last + 1;
	}
}

void delete_ele(int heap[], int &count)//从堆中删除堆顶元素//
{
	heap[0] = heap[count-1];
	count--;
	MoveDown(heap,0,count-1);
}

void FloyAlgorithm(int heap[],int n)//从底到顶构建堆,n为元素个数//
{
	for (int i = n/2 -1; i >= 0; i --)
	{
		MoveDown(heap,i, n-1);
	}
}

void WilliamsAlgorithm(int heap[], int n)//从顶到底构建堆,由John Williams提出//
{
	for (int i = 0; i < n; i ++)
	{
		MoveUp(heap,i);
	}
}

void heapsort(int heap[], int n)//堆排序
{
	for (int i = n/2 -1; i >=0; --i)
		MoveDown(heap,i,n-1);
	for (int i = n-1; i >=1; --i)
	{
		swap(&heap[0],&heap[i]);
		MoveDown(heap,0,i-1);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int data[9] = {2,8,6,1,10,15,3,12,11};
	//heapsort(data,9);
	//FloyAlgorithm(data,9);
	WilliamsAlgorithm(data,9);
	for (int i = 0; i < 9; ++i)
	{
		cout<<data[i]<<" ";
	}
	return 0;
}

抱歉!评论已关闭.