C语言给定n个整数,统计出每个整数出现的次数,按照出现次数从多到少的顺序输出
时间: 2024-04-15 08:07:08 浏览: 99
可以使用哈希表来统计每个整数出现的次数,然后对哈希表中的元素按照出现次数从多到少进行排序输出。
具体操作步骤如下:
1. 定义一个结构体,包含整数值和出现次数两个属性。
2. 读入n个整数,使用哈希表统计每个整数出现的次数,将每个整数的值和出现次数存储到结构体数组中。
3. 对结构体数组进行排序,按照出现次数从多到少的顺序排列。
4. 遍历排序后的结构体数组,按照要求输出每个整数以及它出现的次数。
下面是一份示例代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义结构体,包含整数值和出现次数两个属性
struct Node {
int value;
int count;
};
// 哈希表的大小
const int HASH_SIZE = 10007;
// 哈希表,用于统计每个整数出现的次数
struct HashTable {
Node data[HASH_SIZE];
int size;
void init() {
size = 0;
for (int i = 0; i < HASH_SIZE; i++) {
data[i].value = 0;
data[i].count = 0;
}
}
int find(int x) {
int k = (x % HASH_SIZE + HASH_SIZE) % HASH_SIZE;
while (data[k].count && data[k].value != x) {
k = (k + 1) % HASH_SIZE;
}
return k;
}
void insert(int x) {
int k = find(x);
if (data[k].count == 0) {
data[k].value = x;
data[k].count = 1;
size++;
} else {
data[k].count++;
}
}
};
// 比较函数,用于排序
int cmp(const void* a, const void* b) {
Node* p = (Node*)a;
Node* q = (Node*)b;
if (p->count != q->count) {
return q->count - p->count;
} else {
return p->value - q->value;
}
}
int main() {
int n;
scanf("%d", &n);
// 初始化哈希表
HashTable ht;
ht.init();
// 读入n个整数,统计每个整数出现的次数
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
ht.insert(x);
}
// 将哈希表中的元素存储到结构体数组中
Node a[ht.size];
int k = 0;
for (int i = 0; i < HASH_SIZE; i++) {
if (ht.data[i].count > 0) {
a[k++] = ht.data[i];
}
}
// 对结构体数组进行排序
qsort(a, ht.size, sizeof(Node), cmp);
// 输出结果
for (int i = 0; i < ht.size; i++) {
printf("%d %d\n", a[i].value, a[i].count);
}
return 0;
}
```
阅读全文