首页 > 代码库 > 堆的相关算法
堆的相关算法
堆是一种特殊的二叉树,它具有以下两个性质:
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; }
堆的相关算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。