堆插入、删除、排序

来源:互联网 发布:mac 实用软件下载 编辑:程序博客网 时间:2024/05/18 01:15
最大堆(最小堆)是一个二叉完全树,节点的子节点i的下表为2*i+1,2*i+2
插入过程
:插入到数组末尾,然后逐层向上开始调整。
删除:通常删除根节点,将根节点和末尾节点交换后,从根节点向下调整。

排序:升序排序 ---> 最大堆 :每次将尾部节点和根节点交换,堆长度减1,从根节点向下调整,堆长度减为1时排序结束!


/*************************************************************************

    > File Name: miniHeap.cpp    > Author: ltf    > Mail: @qq.com     > Created Time: Mon 28 Mar 2016 04:32:23 PM CST ************************************************************************/#include<iostream>using namespace std;int heapSize = 0; // 堆的大小int heap[100];//[start,end]// 从start到end开始向下调整void siftDown(int start,int end){int j = start;int i = 2*start+1;while(i <= end){// find the min onei =(i<end)&&(heap[i] > heap[i+1])? i+1:i;if(heap[j] > heap[i]){swap(heap[i],heap[j]);i = j*2+1;}elsebreak;}}// 从第start元素开始向上调整void siftUp(int start){int i = start;// -1/2=0 --> i>0while(i > 0){i = (i-1)/2;if(heap[i] <= heap[start])break;else{swap(heap[i],heap[start]);start = i;}}}void insertElement(int value){heap[heapSize] = value;heapSize++;siftUp(heapSize-1);}bool deleteElement(int &value){if(heapSize == 0)return false;value = heap[0];heap[0] = heap[heapSize-1];heapSize--;siftDown(0,heapSize-1);}void print(){int i;for(i=0;i < heapSize;i++)cout << heap[i] <<" ";cout << endl;}//minHeap  sort increasevoid heapSort(){int i = heapSize-1;while(i>0){swap(heap[0],heap[i]);siftDown(0,i-1);i--;}}int main(){int value = 0;cout << "input the heap elements,end with 0" << endl;for(;;){cin >> value;if(value != 0)insertElement(value);elsebreak;}print();cout << "after delete:" << endl;deleteElement(value);cout << value << "(deleted)";print();heapSort();cout << "after sorted:" << endl;print();return 0;}

0 0
原创粉丝点击