堆排序

作者: 十二找十三 | 来源:发表于2019-07-08 09:48 被阅读0次
#include <stdio.h>

static int size = 0; // 当前数组即将插入元素的下标
static int a[10];// 存储

// swap function
void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

// push function
void max_heap_push(int v)
{
    a[size++] = v;

    int idx = size - 1;
    while (1)
    {
        if (idx == 0)  // root节点
        {
            break;
        }
        int parent = (idx - 1) / 2;

        if (a[idx] > a[parent])
        {
            swap(&a[idx], &a[parent]);
            idx = parent;
        } 
        else
        {
            break;
        }
    }
}

// pop And recover to heap  
int max_heap_pop()
{
    if (size == 0) {
        return -1;
    }

    int pop = a[0];
    
    size--;

    if (size == 0) {
        return pop;
    }
    
    a[0] = a[size];
    
    int idx = 0;
    while (1)
    {
        int left = idx * 2 + 1;
        int right = idx * 2 + 2;

        if (left >= size && right >= size)
        {
            break;
        } 
        else if (right >= size && left < size)  // has only one child
        {
            if (a[idx] < a[left])
            {
                swap(&a[idx], &a[left]);
                idx = left;
            }
            else
            {
                break;
            }
        }
        else  // has both left and right children.
        {
            // find largest from a[idx, left, right]
            int largest_idx = idx;

            if (a[largest_idx] < a[left]) 
            {
                largest_idx = left;
            }

            if (a[largest_idx] < a[right]) 
            {
                largest_idx = right;
            }

            // swap
            if (largest_idx == idx)
            {
                break;
            }
            else if (largest_idx == left)
            {
                swap(&a[idx], &a[left]);
                idx = left;
            }
            else
            {
                swap(&a[idx], &a[right]);
                idx = right;
            }
        }

    }
    return pop;
}

void init_head(int array[], int len)
{
    for (int i = 0; i < len; ++i)
    {
        max_heap_push(array[i]);
    }
}

int main(int argc, char const *argv[])
{
    int array[5] = {1, 2, 3, 4, 5};

    init_head(array, 5);

    for (int i = 0; i < size; ++i)
    {
        printf("%d\n", a[i]);
    }

    printf("-->%d\n", max_heap_pop());

    for (int i = 0; i < size; ++i)
    {
        printf("%d\n", a[i]);
    }

    max_heap_push(6);

    for (int i = 0; i < size; ++i)
    {
        printf("-->%d\n", a[i]);
    }

    return 0;
}

数学模型
Parent(i) = floor((i-1)/2),i 的父节点下标
Left(i) = 2i + 1,i 的左子节点下标
Right(i) = 2(i + 1),i 的右子节点下标

相关文章

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 堆排序

    堆排序

  • C++基础入门之模板堆排序(上):模板上的list的创造与操作

    整段源码链接C++的模板元堆排序 要点 组建数据结构list 组建对list的各种基本操作 堆排序中组建堆排序个个...

  • 3.2-选择排序-堆排序

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

网友评论

      本文标题:堆排序

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