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

//最小堆实现
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

时间: 2024-11-09 10:54:00

最小(大)堆找出数组的最小(大)的k项值的相关文章

python找出数组中第二大的数

#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:找出数组中第2大的数字 ''' def find_Second_large_num(num_list):   '''''   找出数组中第2大的数字   '''   #直接排序,输出倒数第二个数即可   tmp_list=sorted(num_list)   print 'Second_large_num is:', tmp_list[-2]   #设置两个标志位一个存储最

找出数组前N大的数

这个题也是个比较有名的面试题.当然有很多变种. 题目意思基本是:从一个数据量很大的数组里找前N大的元素.不允许排序. 这个题有两个比较好的思路: 思路一:用快速排序的思想,是思想,不是要排序; 思路二:用最大堆的思想. 我暂时只实现了思路一,思路二我之后实现了会补上. 思路一比较简单了.我们先用快排的思想找出第n大的数,然后带上后面n-1个就完事了.因为后面的都比支点数大. 怎么找第n大的数?我在之前的博客写过,请移步到  找第n大的数 代码: #include<stdio.h> #inclu

如何找出数组中第二大的数

1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有了下面这种方式 2.通过设置两个变量来进行判断 这种方式可以只通过一遍扫描数组即可找到第二大数,具体的形式如下:先定义两个变量:一个变量用来存储数组的最大数,初始值为数组首元素,另一个变量用来存储第二大的数,初始值为最小负整数,然后遍历数组元素,如果数组元素的值比最大数变量还大,更新最大数:若数组元

利用快速排序原理找出数组中前n大的数

#include <stdio.h> #include <stdint.h> #include <stdlib.h> #define MAX_SIZE 400001 // 生成不重复的随机数序列写入文件 void gen_test_data(uint32_t cnt) { if( cnt >= MAX_SIZE){printf("cnt too largr\n");return;} uint32_t i = 0; char buf[MAX_SI

找出数组中所有组合中最大的值

面试中,经常有算法题: 比如找出一个数组中的所有组合,并找出最大的值. 代码如下: 1 package com.company.algorithm; 2 3 /** 4 * 选择数组中和的值最大的一组,例如:[2,-7,5,-9],组大的一组是:2,-7,5值为0 5 */ 6 public class SelectValueMaxGroup { 7 public static void main(String[] args) { 8 int[] list = {6, -1, 2, -9, 4,

利用堆排序找出数组中前n大的元素

#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <time.h> #define MAX_SIZE 400001 #define PARENT(i) (i/2) #define RIGHT(i) (i*2 + 1) #define LEFT(i) (i*2) #define EXCHANGE(a,b,t) do{t=a;a=b;b=t;}while(0) // 生成不重复

【趣味算法题】在数组中,对于所有元素,找出比当前元素大的下一个元素

在数组中,对于所有元素,找出比当前元素大的下一个元素 意思就是,eg.  数组为 3 1 2 5 4 6 7 那么我们需要得到的结果应该是  5 2 5 6 6 7 -1 解决方法如下: 暴力匹配: O (n ^ 2 ) 的效率对所有元素匹配过去,效率非常的低 经过提示, 我想到的一种 O ( nlg n ) 效率的算法 只需要对数组扫描一次,我们用一个 Priority_queue 来得到当前最小的元素 Prority_queue 存放的数据结构为: struct sc { int key,

找出数组中每个数右边第一个比它大的元素

题目 找出数组中每个数右边第一个比它大的元素. 思路 暴力解法 单调栈 使用栈结构.从前往后遍历数组每一位时,利用栈更新这一位之前每一位上的数的"右边第一个比它大的元素". 代码 public static int[] findMaxRightWithStack(int[] array) { if(array == null) return null; int n = array.length; int[] ret = new int[n]; Stack<Integer>

找出数组里面的最大值与最小值

package com.lv.study; public class DemoExam2 { public static void main(String[] args) { int nums []={12,23,56,48,78}; //找出数组里面的最大值和最小值 max(nums); min(nums); } public static void min(int nums[]){ int num =nums[0];//默认数组第一个元素是最小的 for(int i=0;i<nums.len