• 数据结构堆的实现


    堆的实现

    // heap.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<vector>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    #define LARGENUM 1000000
    
    
    class Heap
    {
    private:
    	vector<int> array;
    
    	int find(int tofind)
    	{
    		vector<int>::iterator it;
    		it = std::find(array.begin(), array.end(), tofind);
    		return it == array.end() ? -1 : it - array.begin();
    	}
    public:
    	Heap()//构造
    	{
    		array.push_back(LARGENUM);//哨兵
    	}
    
    	void insert(const int val)//插入
    	{
    		_ASSERTE(val < LARGENUM);
    		array.push_back(val);
    		int index = array.size() - 1;
    		while (array[index] > array[index / 2])
    		{
    			array[index] = array[index/ 2];
    			array[index / 2] = val;
    			index = index / 2;
    		}
    	}
    
    	bool erase(int val)//删除
    	{
    		int index = find(val);
    		if (index < 0)
    			return false;
    		array[index] = array.back();
    		array.pop_back();
    		while (index * 2 < array.size())
    		{
    			int t = array[index];
    			if (2 * index + 1 < array.size())
    			{
    				if (array[index] > array[2 * index] && array[index] > array[2 * index + 1])
    					return true;
    				int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index;
    				array[index] = array[nn];
    				array[nn] = t;
    				index = nn;
    			}
    			else
    			{
    				if (array[index] > array[2 * index])
    					return true;
    				int t = array[index];
    				array[index] = array[2 * index];
    				array[2 * index] = t;
    				return true;
    			}
    
    		}
    		
    	}
    
    	int top()//返回堆顶
    	{
    		_ASSERTE(array.size() != 1);
    		return  array[1];
    	}
    
    	void pop()//弹出堆顶
    	{
    		_ASSERTE(array.size() != 1);
    		array[1] = array.back();
    		array.pop_back();
    		int index = 1;
    		
    		while (index * 2 < array.size())
    		{
    			int t = array[index];
    			if (2 * index + 1 < array.size())
    			{
    				if (array[index] > array[2 * index] && array[index] > array[2 * index + 1])
    					return;
    
    				int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index;
    				array[index] = array[nn];
    				array[nn] = t;
    				index = nn;
    			}
    			else
    			{
    				if (array[index] > array[2 * index])
    					return;
    				int t = array[index];
    				array[index] = array[2 * index];
    				array[2 * index] = t;
    				return;
    			}
    
    		}
    	}
    
    	
    	bool empty()
    	{
    		return array.size() == 1;
    	}
    
    	int size()//返回堆的大小
    	{
    		return array.size() - 1;
    	}
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	
    	Heap h;
    	h.insert(10);
    	h.insert(35);
    	h.insert(19);
    	h.insert(5); 
    	h.insert(2); 
    	h.insert(51);
    	h.insert(37);
    	h.insert(7);
    	h.insert(45);
    	h.insert(63);
    	cout << h.size() << endl;
    	cout << h.top()<< endl;
    	h.pop();
    	cout << h.size() << endl;
    	cout << h.top() << endl;
    	h.erase(45);
    
    	system("pause");
    	return 0;
    }
    


    版权声明:

  • 相关阅读:
    Linux下Fortran多文件编译
    java用poi实现对word读取和修改操作
    SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录
    深入Java集合学习系列:LinkedHashSet的实现原理
    Log4Net日志
    程序员创业如何才能成功?
    Asp.net 数据采集基类(远程抓取,分解,保存,匹配)
    response.setContentType()的String参数及对应类型
    深入Java集合学习系列:LinkedHashMap的实现原理
    深入Java集合学习系列:HashSet的实现原理
  • 原文地址:https://www.cnblogs.com/walccott/p/4956877.html
Copyright © 2020-2023  润新知