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

最小(大)堆找出数组的最小(大)的k项值

时间:2016-04-11 20:52:47      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

//最小堆实现
void MyGlobal::min_heapify(int *a, int* b,int left, int right)
{
    int child = 0;
    int tmp = 0;
    int tempb = 0;
    int parent = left;
    assert(a != NULL);
    for (tmp = a[parent],tempb=b[parent]; LEFTSON(parent) <= right; parent = child)
    {
        child = LEFTSON(parent);
        if (child != parent && a[child] > a[child + 1])
        {
            child++;
        }
        if (a[child] < tmp)
        {
            a[parent] = a[child];
            b[parent] = b[child];
        }
        else   //满足最小堆的特性,直接退出
            break;
    }
        a[parent] = tmp;
        b[parent] = tempb;
}
//创建最小堆
void MyGlobal::build_minheap(int *a,int*b, int size)
{
    int i = PARENT(size);
    assert(a != NULL);
    for (; i >= 0; --i)
    {
        min_heapify(a,b, i, size - 1);
    }
}
//主函数
int* MyGlobal::find_Kmin_num_4(int *a, int* b, int size, int k)
{
    int i = 0;
    assert(a != NULL);
    build_minheap(a, b, size - 1);
    int* m = new int[k];
    for ( i = 0; i < k; ++i)
    {
        printf("%d\t", b[0]);
        //删除a[0],释放a[size-1-i]
        m[i] = b[0];
        a[0] = a[size - 1 - i];
        min_heapify(a,b ,0, size - 2 - i);        
    }
    printf("\n");
    return m;
}

其中a是数组,b代表数组的下标。最后printf处如果输出a[0]就是数组最小的k项,输出b[0]就是数组最小k项的下标。b看需要可加可删

另外最大堆在:http://blog.chinaunix.net/uid-20937170-id-3347493.html

最小(大)堆找出数组的最小(大)的k项值

标签:

原文地址:http://www.cnblogs.com/Daringoo/p/5379944.html

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