给定N个整数,统计每个整数出现次数,按出现次数从多到少排列C语言
时间: 2024-09-23 17:00:40 浏览: 37
给定N个正整数,请统计奇数和偶数各有多少个-C语言代码
在C语言中,你可以使用哈希表(如数组或结构体结合下标)来统计每个整数出现的次数,然后利用优先队列(堆)或快速选择等算法对结果进行排序。这里是一个简单的步骤描述:
1. **初始化**:创建一个大小为`N+1`的整型数组`count`,用于存储每个整数出现的次数,因为索引从0开始,所以最大值可以是`N`。
```c
int count[N + 1] = {0};
```
2. **遍历输入**:遍历给定的整数数组`arr[]`,对于每一个元素`num`,递增`count[num]`。
```c
for (int i = 0; i < N; i++) {
count[arr[i]]++;
}
```
3. **统计并排序**:遍历`count[]`数组,将元素作为键值对存入另一个数组或结构体,同时保存其对应的计数值。为了保持出现次数由高到低的顺序,可以使用一个优先队列(最小堆),每次插入新元素时检查是否需要调整堆的结构。
```c
typedef struct {
int num;
int freq;
} Pair;
Pair heap[50]; // 简单起见,假设最多有50个不同元素
int size = 0;
void insert(Pair pair) {
// 插入操作...
}
void sort() {
for (size_t i = 0; i <= N; i++) {
if (count[i]) {
Pair p = {i, count[i]};
insert(p);
}
}
while (!heap[size].freq) size--;
// 根据需要调整堆并删除最小频次的元素
}
```
4. **输出结果**:最后,从堆中取出元素并按照频率排序打印出来。
```c
void print_sorted_counts() {
for (int i = size - 1; i >= 0; i--) {
printf("%d occurs %d times\n", heap[i].num, heap[i].freq);
}
}
```
阅读全文