现在我有一个长度已知的数组(例如1024点fft的结果)。我希望找到其中最大的k个点对应的索引。
首先,排序算法有很多种,但是排序之后的数组不包含原索引信息,因此我考虑用结构体的方式,储存索引信息。其次,我只需要找到最大k个点,不需要他们的大小顺序。因此我决定用指针来实现,也是一种练习 😃
定义结构体
浅显易懂!idx即索引index。
struct node
{
int idx;
int num;
};
主要思路
首先,我定义一个空的结构体数组y,用memset初始化,用于储存数据中的k个最大值。这里我设k为3:
struct node y[3];
memset(y, 0, sizeof(struct node) * 3);
然后我定义一个结构体指针,指向数组 y 中 num 最小的结构体。初始化指向y[0]。此时y[0]的idx和num都是0。
struct node* max_min = &y[0];
接着对输入数据x进行遍历。如果 x[i] 比 max_min 的 num 大,就让 max_min 的 num 等于 x[i] , idx 等于 i 。
此时 max_min 指向的值已经修改,max_min 不再是数组 y 中的最小值,因此对y进行遍历,找到新的最小值,地址赋给 max_min。
for (int i = 0; i < k; i++)
{
if (x[i] > (*max_min).num)
{
(*max_min).num = x[i];
(*max_min).idx = i;
for (int j = 0; j < 3; j++)
{
if (y[j].num < (*max_min).num)
{
max_min = & y[j];
}
}
}
}
整个文件
#include <stdio.h>
#include <string.h>
struct node
{
int idx;
int num;
};
void getMax(int* x, struct node* y, int k)
{
struct node* max_min = &y[0];
for (int i = 0; i < k; i++)
{
if (x[i] > (*max_min).num)
{
(*max_min).num = x[i];
(*max_min).idx = i;
for (int j = 0; j < 3; j++)
{
if (y[j].num < (*max_min).num)
{
max_min = & y[j];
}
}
}
}
}
int main()
{
int x[] = {5, 7, 2, 9, 1, 8, 6, 4, 3};
struct node y[3];
memset(y, 0, sizeof(struct node) * 3);
getMax(x, y, 9);
for (int j = 0; j < 3; j++)
printf("index %d, number %d\n", y[j].idx, y[j].num);
return 0;
}