c语言 int top,C语言版 topK 算法实现

/* topK算法实现 */

#include /* 调整小顶堆,pos:唯一违反堆性质的点的位置 */

void heapify(int *arr, const size_t len, size_t pos)

{

int min;

size_t child = (pos * 2) + 1;// 左孩子

while (1)

{

if (child + 1 < len)// 有两个孩子

{

min = arr[child] < arr[child + 1] ?

arr[child] : arr[++child];

}

else if (child + 1 == len)// 只有左孩子

{

min = arr[child];

}

else break;// 数组结束,调整完成

if (arr[pos] > min)

{

arr[child] = arr[pos];

arr[pos] = min;

pos = child;// 更新父节点索引

child = (pos * 2) + 1;// 下一个调整点

}

else break;// 已经是堆,无需调整

}

}

/* 建立小顶堆 */

void build_heap(int *arr_k, const int k)

{

int i;

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

{

heapify(arr_k, k, i);

}

}

/* 选出数组中最大的k个数,存入数组arr_k中 */

void top_k(const int *arr,const size_t len,

int *arr_k, const size_t k)

{

size_t i;

for (i = 0; i < k; ++i) arr_k[i] = arr[i];

build_heap(arr_k, k);// 用arr的前k个数建堆

for (; i < len; ++i)

{

arr_k[0] = arr[i];

heapify(arr_k, k, 0);

}

}

/* 测试代码 */

int main()

{

int a[] = { 8, 1, 2, 7, 3, 4, 5, 6, 9 };

#define K 4

size_t i;

int arr_k[K];

top_k(a, 9, arr_k, K);

for (i = 0; i < K; ++i)

{

printf("%d ", arr_k[i]);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值