堆的相关算法
堆是一种特殊的二叉树。它具有下面两个性质:
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; }