码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-08 11:22:27      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:tin   一个   parent   代码   i++   ati   index   序列化   ++   

前言

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

下沉与上浮

下沉

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

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;

}
```

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

标签:tin   一个   parent   代码   i++   ati   index   序列化   ++   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!