zoukankan      html  css  js  c++  java
  • 定义

    • 堆是一棵完全二叉树
    • 树中每个结点的值均不大于(或不小于)左右孩子结点的值
    • 一般使用优先队列实现

    向下调整

    • 因为向下调整默认调整的节点后面的都是排好序的,所以在使用向下调整时,都是从后往前
    //向下调整:把欲调整结点与子节点比较
    void downAdjust(int low,int high)
    {
    	int i = low, j = 2 * i;//j是左孩子结点
    	while (j <= high)//i存在孩子
    	{
    		if (j + 1 <= high && heap[j + 1] > heap[j])
    		{
    			j = j + 1;
    		}
    		if (heap[j] > heap[i])
    		{
    			int temp = heap[j];
    			heap[j] = heap[i];
    			heap[i] = temp;
    			i = j;
    			j = 2 * i;
    		}
    		else
    		{
    			break;
    		}
    		
    	}
    
    }
    

    建堆

    //建堆
    void createHeap()
    {
    	for (int i = n / 2; i >= 1; i--)
    	{
    		downAdjust(i, n);
    	}
    }
    

    删除栈顶

    //删除栈顶 把最后一个元素放在栈顶 然后向下调整
    void deleteTop()
    {
    	heap[1] = heap[n--];
    	downAdjust(1, n);
    }
    

    向上调整

    //向上调整 把当前节点与父亲节点作比较
    void upAdjust(int low,int high)
    {
    	int i = high, j = i / 2;
    	while (j >= low)
    	{
    		if (heap[i] <= heap[j])
    		{
    			//交换
    			int temp = heap[i];
    			heap[i] = heap[j];
    			heap[j] = temp;
    			i = j;
    			j = i / 2;
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    

    添加元素

    //添加元素:添加到末尾后,进行调整
    void insert(int v)
    {
    	heap[++n] = v;
    	upAdjust(1, n);
    }
    

    堆排序

    //堆排序 取出每次最值(栈顶)放在最后,将未排序的元素的末尾放在栈顶,进行向下调整
    void heapSort()
    {
    	createHeap();
    	for (int i = n; i >1; i++)
    	{
    		int temp = heap[1];
    		heap[1] = heap[i];
    		heap[i] = temp;
    		downAdjust(1, i-1);
    	}
    }
    
  • 相关阅读:
    Decimal、 Float、 Double 使用
    jdk1.7的collections.sort(List list)排序问题
    $watch、$digest、$apply
    BeanNameViewResolver
    This system is not registered with RHN
    JNI字段描述符-Java Native Interface Field Descriptors
    服务器端cs文件
    ASP.NET基础(一)
    Android开发日记(七)
    登陆 注册
  • 原文地址:https://www.cnblogs.com/code-fun/p/15228724.html
Copyright © 2011-2022 走看看