现在的位置: 首页 > 综合 > 正文

剑指OFFER之最小堆篇

2014年09月05日 ⁄ 综合 ⁄ 共 604字 ⁄ 字号 评论关闭
#include <stdio.h>

void heap_adjust(int a[], int start, int end)
{
    int temp;
    int i;

    temp = a[start];
    for (i = 2 * start + 1; i <= end; i = i * 2 + 1)
    {
       if (i < end && a[i] > a[i+1]) 
       {
           i++;
       }

       if (temp <= a[i])
       {
           break;
       }
       else
       {
           a[start] = a[i];
           start = i;
       }
    }

    a[start] = temp;
}

void heap_create(int a[], int n)
{
    int i;
    
    for (i = n/2 - 1; i >= 0; i--)
    {
        heap_adjust(a, i, n - 1);
    }
}

void heap_sort(int a[], int n)
{
    int i;

    for (i = 1; i < n; i++) 
    {
        printf("%d ", a[0]);
        a[0] = a[n - i];
        heap_adjust(a, 0, n - 1 - i);
    }
}

/* 面试题30:最大的k个数 */
void get_biggest_k_numbers(int input[], int n, int k)
{
    int i;

    if (!input || n <= 0 || n < k || k <= 0)
    {
        return;
    }

    heap_create(input, k);

    for (i = k; i < n; i++)
    {
        if (input[i] > input[0])
        {
            input[0] = input[i];
            heap_adjust(input, 0, k - 1);
        }
    }
}

【上篇】
【下篇】

抱歉!评论已关闭.