序列化二叉堆与二叉堆排序

前言

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

下沉与上浮

下沉

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

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;

}
```

原文地址:https://www.cnblogs.com/aoximin/p/12275608.html

时间: 2024-10-14 15:12:59

序列化二叉堆与二叉堆排序的相关文章

堆、二叉堆、堆排序

堆.二叉堆.堆排序 堆的概念: n个元素序列 { k1, k2, k3, k4, k5, k6 -. kn } 当且仅当满足以下关系时才会被称为堆: ki <= k2i,ki <= k2i+1 或者 ki >= k2i,ki >= k2i+1 (i = 1,2,3,4 .. n/2) 如果数组的下表是从0开始,那么需要满足 ki <= k2i+1,ki <= k2i+2 或者 ki >= k2i+1,ki >= k2i+2 (i = 0,1,2,3 .. n

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

本文标签:  堆排序 php php算法 堆排序算法 二叉堆 数据结构 REST   服务器 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆 因此,最大堆中的

堆之二叉堆

堆的定义 堆通常是一个可以被看做一棵树,它满足下列性质: 堆中任意节点的值总是不大于(不小于)其子节点的值: 堆总是一棵完全树. 将任意节点不大于其子节点的堆叫做最小堆或小根堆,而将任意节点不小于其子节点的堆叫做最大堆或大根堆.常见的堆有二叉堆.左倾堆.斜堆.二项堆.斐波那契堆等等. 二叉堆 堆有两种性质:结构性和堆序性 结构性:堆是一颗完全二叉树.若设完全二叉树的高度是h,则它的节点数是2^h到2^(h+1) - 1:则节点数为N的完全二叉树的高度O(logn). 完全二叉树中父子节点位置关系

判断两序列是否为同一棵二叉搜索树

题目来源:九度教程第36题 九度提供的算法设计思路是:对输入的数字序列构建二叉排序树,并对它们进行前序和中序的遍历,依次比较遍历结果是否相同,若相同则说明两棵二叉排序树相同,否则不同. 这个设计思路是没有问题的,但是有点画蛇添足的成份.那么这个“蛇足”是什麽呢?试想一下二叉排序树的性质,如果对二叉排序树来说,对其进行中序遍历,那么无论一组数字按照怎样的顺序构建,其中序遍历后得到的序列都是一样的.例如题目给的测试实例,{5,6,7,4,3,2}和{5,7,6,3,4,2},他们构造的二叉排序树如下

C++ 查询一个序列是否可能是一个二叉搜索树的后序遍历

其中,最重要的是,sequence一开始如果它的值为空的话,它是要返回false.但是之后,只要sizex小于3都应该返回true class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) { return false; } return VerifySquenceOfBSTChild(sequence); } bool VerifySquenceOfBST

【数据结构】二叉堆

看到一篇很好的博文,来自http://blog.csdn.net/morewindows/article/details/6709644 下面是博文内容 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆).

优先队列及(二叉)堆

数据结构书籍与算法书(包括算法导论.算法设计)通常将优先队列(Priority Queue)与堆(Heap)放在一起讲,算法导论上先讲堆这个特殊的数据结构,后讲堆的两个应用,堆排序与优先队列.算法设计这本书先讲优先队列是个什么样的数据结构,有什么性质,为什么需要优先队列这种数据结构,然后讲实现优先队列有什么样的要求,而这些要求数组(Array)和链表(Linked List)都不能满足,所以我们需要设计一种新的数据结构来满足这些要求,那就是堆.个人更喜欢算法设计书上这种顺序. 某些特定的算法,只

在A*寻路中使用二叉堆

接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序:     这一篇文章,是"A* Pathfinding for Beginners.",也就是我翻译的另一篇文章<A*寻路初探>的补充,在这篇文章里,作者再一次展现了他阐述复杂话题的非凡能力,用通俗易懂的语句清晰的解释了容易让人迷惑的问题.还是那句话,如果你看了这篇文章仍然无法领会作者的意图,那

普林斯顿公开课 算法4-2:二叉堆

二叉树 介绍二叉堆之前首先介绍二叉树.二叉树有一个根节点,节点下又有两个子节点.完全二叉树是指一个二叉树树除了最底层,其他层都是完全平衡的. 完全二叉树最基本的性质就是它的高度是 floor(lgN). 二叉堆 二叉堆是完全二叉树的一种,每个节点对应一个数值,而且这个数值都大于等于它子节点的数值. 下图是一个二叉堆. 二叉堆的储存 由于二叉堆是完全二叉树,所以它可以用一个数组进行储存.所以不需要创建节点对象,再建立节点之间的连接.这样节省了很多开销. 用数组a[]表示一个二叉堆有以下特性: a[