我是靠谱客的博主 感性煎蛋,最近开发中收集的这篇文章主要介绍寻找前k个最小元素——用最小堆实现…,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

//copyright@ 泡泡鱼

//July.06.02

 

//@lingyun310:先对元素数组原地建最小堆,O(n)。然后提取K次,但是每次提取时,

//换到顶部的元素只需要下移顶多k次就足够了,下移次数逐次减少。此种方法的复杂度为On+k^2)。

#include <stdio.h> 

#include <stdlib.h> 

#define MAXLEN 123456 

#define 100 

 

// 

void HeapAdjust(int array[], int i, int Length) 

    int child,temp; 

    for(temp=array[i];2*i+1<Length;i=child) 

    

        child 2*i+1; 

        if(child<Length-1 && array[child+1]<array[child]) 

            child++; 

        if (temp>array[child]) 

            array[i]=array[child]; 

        else 

            break

        array[child]=temp; 

    

 

void Swap(inta,intb) 

    *a=*a^*b; 

    *b=*a^*b; 

    *a=*a^*b; 

 

int GetMin(int array[], int Length,int k) 

    int min=array[0]; 

    Swap(&array[0],&array[Length-1]); 

 

    int child,temp; 

    int i=0,j=k-1; 

    for (temp=array[0]; j>0 && 2*i+1<Length; --j,i=child) 

    

        child 2*i+1; 

        if(child<Length-1 && array[child+1]<array[child]) 

            child++; 

        if (temp>array[child]) 

            array[i]=array[child]; 

        else 

            break

        array[child]=temp; 

    

 

    return min; 

 

void Kmin(int array[] int Length int k) 

    for(int i=Length/2-1;i>=0;--i) 

    //初始建堆,时间复杂度为O(n) 

    HeapAdjust(array,i,Length); 

 

    int j=Length; 

    for(i=k;i>0;--i,--j) 

    //k次循环,每次循环的复杂度最多为k次交换,复杂度为o(k^2) 

    

        int min=GetMin(array,j,i); 

        printf("%d,"min); 

    

 

int main() 

    int array[MAXLEN]; 

    for(int i=MAXLEN;i>0;--i) 

        array[MAXLEN-i] i; 

 

    Kmin(array,MAXLEN,K); 

    return 0; 

最后

以上就是感性煎蛋为你收集整理的寻找前k个最小元素——用最小堆实现…的全部内容,希望文章能够帮你解决寻找前k个最小元素——用最小堆实现…所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部