c语言中统计一组数中每个数字重复出现的次数,并用四种不同算法实现
时间: 2024-09-29 14:06:32 浏览: 49
基于C语言实现的多种可视化排序算法演示程序
在C语言中,统计一组数中每个数字重复出现的次数可以采用多种算法,这里我会分别介绍哈希表法、计数排序法、位运算法以及使用数组和下标的方法。
**1. 哈希表法 (Hash Table)**
这是一种基于数据映射的策略,使用一个数组或哈希表作为存储结构。遍历输入数组,对于每一个元素,如果它已经在哈希表中,则增加对应位置的计数;否则,将该元素添加到哈希表并设置计数为1。
```c
#include <stdio.h>
#define MAX 100
void count(int arr[], int n, int hash[MAX]) {
for (int i = 0; i < n; i++) {
hash[arr[i]]++;
}
}
void printCount(int hash[], int n) {
for (int i = 0; i <= n; i++) {
if (hash[i] > 0)
printf("%d occurs %d times\n", i, hash[i]);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 2, 3, 4, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int hash[MAX] = {0};
count(arr, n, hash);
printCount(hash, n);
return 0;
}
```
**2. 计数排序法 (Counting Sort)**
适用于输入范围较小且无负值的情况。先创建一个计数数组,然后遍历原数组,累加每个元素出现的次数,最后通过原数组的位置更新实际出现次数。
```c
#include <stdio.h>
void countingSort(int arr[], int n) {
int output[n];
int count[10] = {0};
// 计算每个元素出现的次数
for (int i = 0; i < n; i++)
count[arr[i]]++;
// 更新输出数组
for (int i = 1; i < 10; i++)
count[i] += count[i - 1];
for (int i = n - 1; i >= 0; i--) {
output[count[arr[i]] - 1] = arr[i];
count[arr[i]]--;
}
// 将结果复制回原数组
for (int i = 0; i < n; i++)
arr[i] = output[i];
}
int main() {
int arr[] = {1, 2, 3, 4, 4, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
countingSort(arr, n);
for (int i = 0; i < n; i++)
printf("%d occurs %d times\n", arr[i], count[arr[i]]);
return 0;
}
```
**3. 位运算法 (Bitwise Operations)**
这种方法利用位操作对整数进行处理,适用于特定的数据集。例如,二进制表示中相邻数字位的变化就是统计次数。
```c
#include <stdio.h>
#include <math.h>
void bitShiftCount(int arr[], int n) {
for (int i = 0; i < n; i++) {
int mask = 1 << arr[i];
arr[i] = arr[i] & (-arr[i]); // 抑制最高有效位
while (mask & arr[i]) { // 移除最高1位
arr[i] &= mask;
mask >>= 1;
}
}
for (int i = 0; i < n; i++) {
printf("%d occurs %d times\n", i + 1, __builtin_popcount(arr[i]));
}
}
int main() {
int arr[] = {1, 2, 3, 4, 4, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
bitShiftCount(arr, n);
return 0;
}
```
**4. 数组和下标法**
最简单直接的方法是创建一个大小与输入数组相同的计数数组,每次遇到相同的数字就递增其对应的计数值。
```c
#include <stdio.h>
void arrayCount(int arr[], int n, int count[]) {
for (int i = 0; i < n; i++)
count[arr[i]]++;
for (int i = 0; i <= n; i++) {
if (count[i])
printf("%d occurs %d times\n", i, count[i]);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 4, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int count[n+1] = {0};
arrayCount(arr, n, count);
return 0;
}
```
阅读全文