zoukankan      html  css  js  c++  java
  • 序列化二叉堆与二叉堆排序

    前言

    二叉堆分为最大堆与最小堆,一组不规则的完全二叉树或者近完全二叉树,可以通过调整称为二叉堆。
    序列化:
    形成二叉堆通过下沉。
    插入元素通过上浮。
    排序:
    二叉堆的最大堆为父节点一定大于或者等于子节点,堆顶一定最大。
    如果最小堆的堆顶与最后一个元素交互,那么最后一个元素一定最大。
    如果最后一个元素不参加排序,那么是一颗新的树,新的树在形成最大堆,然后和堆顶又和最后一个元素交换,继续前面的操作。
    将会形成一个从小到大排序。

    下沉与上浮

    下沉

    原理:让每一个元素和它的子节点对比,代码简单明了。

    public static void Func(int[] arr,bool up)
    {
    	for (int i= arr.Length / 2; i>=0;i++)
    	{
    		ElementDown(arr,i,arr.Length);
    	}
    }
    public static void ElementDown(int []arr,int parentIndex,int length)
    {
    	var temp = arr[parentIndex];
    	var LeftchildIndex = parentIndex * 2 + 1;
    	while(LeftchildIndex<length)
    	{
    		var childIndex = LeftchildIndex;
    		if (LeftchildIndex + 1 < length && arr[LeftchildIndex] > arr[LeftchildIndex + 1])
    		{
    			childIndex++;
    		}
    
    		if (temp<arr[childIndex])
    		{
    			break;
    		}
    
    		arr[parentIndex] = arr[childIndex];
    		parentIndex = childIndex;
    		childIndex= parentIndex * 2 + 1;
    	}
    	arr[parentIndex] = temp;
    }
    
    

    插入上浮

    public static void ElementUp(int[] arr)
    {
    	var LastChildIndex = arr.Length - 1;
    	int parentIndex = 0;
    	parentIndex = (LastChildIndex-1) / 2;
    	var temp = arr[parentIndex];
    	while (parentIndex>d=0&&temp < arr[LastChildIndex])
    	{
    		arr[LastChildIndex] = arr[parentIndex];
    		LastChildIndex = parentIndex;
    		parentIndex = (LastChildIndex - 1) / 2;
    	}
    	arr[LastChildIndex] = temp;
    }
    

    排序

    public static void heapSort(int [] arr)
    {
    	// 调整堆
    	Func(arr,arr.Length);
    	var temp = 0;
    	// 排序
    	for (int i=arr.Length-1;i>=0;i++)
    	{
    		temp = arr[i];
    		arr[i] = arr[0];
    		arr[0] = temp;
    		ElementDown(arr,0,i);
    	}
    }
    
    public static void Func(int[] arr,int rang)
    {
    	for (int i= arr.Length / 2; i>=0;i++)
    	{
    		ElementDown(arr,i, rang);
    	}
    }
    
    public static void ElementDown(int []arr,int parentIndex,int length)
    {
    	var temp = arr[parentIndex];
    	var LeftchildIndex = parentIndex * 2 + 1;
    	while(LeftchildIndex<length)
    	{
    		var childIndex = LeftchildIndex;
    		if (LeftchildIndex + 1 < length && arr[LeftchildIndex] > arr[LeftchildIndex + 1])
    		{
    			childIndex++;
    		}
    
    		if (temp<arr[childIndex])
    		{
    			break;
    		}
    
    		arr[parentIndex] = arr[childIndex];
    		parentIndex = childIndex;
    		childIndex= parentIndex * 2 + 1;
    	}
    	arr[parentIndex] = temp;
    }
    
  • 相关阅读:
    BMP图像信息隐藏
    多项式模2运算及求逆元
    day08 xml tomcat
    day07 c3p0连接池
    day06 多表查询
    java学习日记(day30--dbutils)
    java学习日记(29 JDBC)
    java学习日记(28)-- mysql基础
    activiti主要组件解析
    activiti流程跟踪图算法
  • 原文地址:https://www.cnblogs.com/aoximin/p/12275608.html
Copyright © 2011-2022 走看看