寻找前k个最小元素——用最小堆实现…

本文介绍了一种使用最小堆来找出数组中前K个最小元素的方法,并给出了详细的算法实现过程。通过原地建立最小堆,再进行K次提取操作,确保了算法的时间复杂度为O(n+k^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//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; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值