zoukankan      html  css  js  c++  java
  • 【数据结构第四周】树知识点整理(下)【堆】

    队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

    1、堆的两个特性

    结构性:用数组表示的完全二叉树

    有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)

    最大堆(MaxHeap)”,也称“大顶堆”:最大值 

    最小堆(MinHeap)”,也称“小顶堆” :最小值 

    2、

    typedef struct HeapStruct *MaxHeap; 
    struct HeapStruct {
    	ElementType *Elements; /* 存储堆元素的数组 */
    	int Size;/*堆的当前元素个数*/
    	int Capacity;/*堆的最大容量*/
    };
    
    MaxHeap Create( int MaxSize )
    {
        MaxHeap H = malloc( sizeof( struct HeapStruct ) );/* 创建容量为MaxSize的空的最大堆 */
        H->Elements = malloc( (MaxSize+1) * sizeof(ElementType)); 
        H->Size = 0;
        H->Capacity = MaxSize;
        H->Elements[0] = MaxData;
        /* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */ 
        return H;
    }
    

    3、将新增结点插入到从其父结点到根结点的有序序列中 

    /* 将元素item 插入最大堆H,其中H->Elements[0]已经定义为哨兵 */
    void Insert( MaxHeap H, ElementType item )
    { 
    	int i;
    	if ( IsFull(H) ) {
    		printf("最大堆已满");
    		return; 
    	}
    	i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */ 
    	for ( ; H->Elements[i/2] < item; i/=2 )
    	{
    		H->Elements[i] = H->Elements[i/2]; /* 向下过滤结点 */
    	}
    	
    	H->Elements[i] = item; /* 将item 插入 */
    }
    

    4、删除最大堆中的最大值元素

    /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */ 
    ElementType DeleteMax( MaxHeap H )
    { 
    	int Parent, Child;
    	ElementType MaxItem, temp;
    	if ( IsEmpty(H) ) {
    		printf("最大堆已为空");
    		return; 
    	}
    	MaxItem = H->Elements[1]; /* 取出根结点最大值 */
        /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */ 
    	temp = H->Elements[H->Size--];
    	for( Parent=1; Parent*2<=H->Size; Parent=Child ) {
            Child = Parent * 2;
            if( (Child!= H->Size) && (H->Elements[Child] < H->Elements[Child+1]) ) 
            {
            	Child++; /* Child指向左右子结点的较大者 */
            }
            if( temp >= H->Elements[Child] ) break; 
            else /* 移动temp元素到下一层 */
            H->Elements[Parent] = H->Elements[Child];
        }
        H->Elements[Parent] = temp; 
        return MaxItem;
    }
    

     

  • 相关阅读:
    SHELL脚本扩展
    Linux服务器核心参数配置
    JavaIO系统
    SHELL脚本进阶
    计算机是怎么跑起来的?
    3年,从双非到百度的学习经验总结
    桥接模式:探索JDBC底层实现
    并发编程(三):从AQS到CountDownLatch与ReentrantLock
    并发编程(四):ThreadLocal从源码分析总结到内存泄漏
    Zookeeper:分布式程序的基石
  • 原文地址:https://www.cnblogs.com/acmsummer/p/4251726.html
Copyright © 2011-2022 走看看