堆的相关算法

来源:互联网 发布:莎士比亚翻译 知乎 编辑:程序博客网 时间:2024/05/16 09:23

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

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;}elsebreak;}}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;}


1 0
原创粉丝点击