• 堆的相关算法


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

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


  • 相关阅读:
    dapper hepler帮助类
    别人在用你的什么技术在赚钱.其实你天天在做
    把asp.net mvc5 controller 单独放置在一个项目实例
    重写和动态创建 asp.net mvc 的控制器
    Linux 配置环境变量,环境变量优先级
    Redhat/ Centos/Ubuntu Linux sudo 权限配置,添加root权限
    Linux和window的文件传输 ( NFS篇 )
    安装R软件,R-3.5.3软件的下载、编译及安装
    yum 源
    瓜大无人船踩坑记3
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6791465.html
Copyright © 2020-2023  润新知