堆与堆排序

作者: Ivan07 | 来源:发表于2020-11-29 23:13 被阅读0次

姓名:毛浩 学号:17029250003

【嵌牛导读】一道力扣题。

【嵌牛鼻子】力扣

【嵌牛提问】如何解决同位异构词

【嵌牛正文】

堆与堆排序

@(数据结构)[堆||排序]

以下代码不敢保证均对,须自己验证


[TOC]

二叉堆的定义

二叉堆是完全二叉树或者是近似完全二叉树。
二叉堆满足两个特性:

  • 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
  • 每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。
    当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:


    1.png

堆的存储

一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。

堆的操作

2.png

堆的插入

每次插入都是将新数据插入到数组末尾,在插入之前数组即为有序数组,现在的任务相当于将一个数插入到有序数组中,一个插入排序算法如下:

void MinHeapFixup(int a[], int i){
    int j, tmp;
    tmp = a[i];
    j = (i - 1) / 2;//父节点
    while(j >= 0 && i != 0){
        if(a[j] < tmp)
            break;
        a[i] = a[j];
        i = j;
        j = (i - 1) / 2;
    }
    a[i] = tmp;
}

更简短的表达为:

void MinHeapFixup(int a[], int i){
    for(int j=(i-1)/2; j>=0 && a[i]>a[j]; i=j, j=(i-1)/2){
        swap(a[i], a[j]);
    }
}

堆的删除

按定义,堆中每次都只能删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点将一个数据的“下沉”过程。下面给出代码:

//  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
void MinHeapFixdown(int a[], int i, int n)  
{
    int k, j;
    for (j = 2 * i + 1, k = i; j < n; k = j, j = 2 * j + 1)
    {
        if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的  
            j++;
        if (a[j] >= a[k])
            break;
        Swap(a[k], a[j]);
    }
}

//在最小堆中删除数
void MinHeapDeleteNumber(int a[], int n)
{
    Swap(a[0], a[n - 1]);
    MinHeapFixdown(a, 0, n - 1);
}

相关文章

  • 堆与堆排序

    鸣谢:https://www.cnblogs.com/chengxiao/p/6129630.htmlhttps:...

  • 堆与堆排序

    因为堆(二叉堆)是一个完全二叉树,所以一般使用数组来存放 堆的性质 一句话来说就是父节点比子节点的数据要小(小顶堆...

  • 堆与堆排序

    堆 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于左右孩子节点的值,称为大顶堆;每个节点的值都小于或等于左...

  • 堆与堆排序

    姓名:毛浩 学号:17029250003 【嵌牛导读】一道力扣题。 【嵌牛鼻子】力扣 【嵌牛提问】如何解决同位...

  • 堆与堆排序

    堆(大顶堆)的概念 堆是一种特殊的二叉树,大顶堆就是根节点为最大值的堆,它具有如下的特点: 堆是完全二叉树 堆常用...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • 排序_堆与堆排序

    与简单选择排序的关系 简单选择排序过程有这个问题:在待排序的n个记录中选择一个最小的记录需要比较n-1次。这样的操...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 3.11 堆的概念及堆排序思路

    Chapter3: 更好的查找与排序算法 11. 堆的概念及堆排序 [1] 图解排序算法(三)之堆排序 讲得很好,...

  • 堆排序的实现

    用大顶堆实现堆排序

网友评论

    本文标题:堆与堆排序

    本文链接:https://www.haomeiwen.com/subject/zhulwktx.html