C程序 查找数组中常见元素

下面是查找数组中常见元素的使用攻略:

1. 程序介绍

本程序的功能是,在一个给定的整型数组中,查找出出现次数最多的若干个元素。

2. 环境要求

本程序使用 C 语言编写,需要在计算机上安装 C 编译器才能运行。常用的 C 编译器有 GCC、Clang、Visual Studio 等。此外,程序需要在控制台(命令行)下运行。

3. 程序结构

程序的主要流程分为以下几个步骤:

  1. 读入数组;
  2. 统计元素个数;
  3. 找出出现次数最多的若干个元素;
  4. 输出结果。

4. 读入数组

程序首先需要读入一个整型数组。数组的大小可以在程序中定义,也可以从用户处输入。下面是一个例子:

// 定义数组大小
#define MAX_SIZE 100

// 读入数组
int arr[MAX_SIZE];
int n; // 数组实际大小
printf("请输入数组大小(不超过 %d):", MAX_SIZE);
scanf("%d", &n);
printf("请输入数组元素:");
for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
}

5. 统计元素个数

程序需要统计每个元素在数组中出现的次数。可以使用一个哈希表(或桶)来存储每个元素以及对应的出现次数。下面是一个例子:

// 哈希表(桶)
#define HASH_SIZE 100000
int hash[HASH_SIZE] = {0};

// 统计元素个数
for (int i = 0; i < n; i++) {
    int key = arr[i];
    hash[key]++;
}

6. 找出出现次数最多的若干个元素

程序需要找到出现次数最多的若干个元素。可以使用一个最小堆来存储出现次数最多的元素。具体实现是,遍历哈希表,将元素和对应的出现次数添加到最小堆中。如果最小堆的大小超过需要输出的元素个数,就弹出堆顶元素。最后最小堆中剩余的元素就是出现次数最多的若干个元素。下面是一个例子:

// 最小堆
typedef struct {
    int key;
    int value;
} HeapNode;
#define HEAP_SIZE 100
HeapNode heap[HEAP_SIZE];
int heapSize = 0;

// 添加元素到最小堆中
void addToHeap(int key, int value) {
    if (heapSize < HEAP_SIZE) {
        heap[heapSize].key = key;
        heap[heapSize].value = value;
        heapSize++;
        // 维护堆结构
        int i = heapSize - 1;
        while (i > 0) {
            int p = (i - 1) / 2;
            if (heap[p].value > heap[i].value) {
                // 交换节点
                HeapNode tmp = heap[p];
                heap[p] = heap[i];
                heap[i] = tmp;
                i = p;
            } else {
                break;
            }
        }
    } else if (value > heap[0].value) {
        // 比堆顶元素大,替换掉堆顶元素
        heap[0].key = key;
        heap[0].value = value;
        // 维护堆结构
        int i = 0;
        while (i < heapSize) {
            int l = i * 2 + 1;
            int r = i * 2 + 2;
            int min = i;
            if (l < heapSize && heap[l].value < heap[min].value) {
                min = l;
            }
            if (r < heapSize && heap[r].value < heap[min].value) {
                min = r;
            }
            if (min != i) {
                // 交换节点
                HeapNode tmp = heap[i];
                heap[i] = heap[min];
                heap[min] = tmp;
                i = min;
            } else {
                break;
            }
        }
    }
}

// 遍历哈希表,添加元素到最小堆中
void traverseHash() {
    for (int i = 0; i < HASH_SIZE; i++) {
        if (hash[i] > 0) {
            addToHeap(i, hash[i]);
        }
    }
}

7. 输出结果

程序最后需要输出出现次数最多的若干个元素以及它们在数组中的位置。下面是一个例子:

// 输出结果
printf("出现次数最多的元素:\n");
while (heapSize > 0) {
    HeapNode node = heap[0];
    printf("%d(%d次):", node.key, node.value);
    for (int i = 0; i < n; i++) {
        if (arr[i] == node.key) {
            printf("%d ", i);
        }
    }
    printf("\n");
    // 弹出堆顶元素
    heapSize--;
    if (heapSize > 0) {
        heap[0] = heap[heapSize];
        // 维护堆结构
        int i = 0;
        while (i < heapSize) {
            int l = i * 2 + 1;
            int r = i * 2 + 2;
            int min = i;
            if (l < heapSize && heap[l].value < heap[min].value) {
                min = l;
            }
            if (r < heapSize && heap[r].value < heap[min].value) {
                min = r;
            }
            if (min != i) {
                // 交换节点
                HeapNode tmp = heap[i];
                heap[i] = heap[min];
                heap[min] = tmp;
                i = min;
            } else {
                break;
            }
        }
    }
}

8. 示例说明

下面是两个示例说明,展示程序如何使用。

示例 1

假设我们要查找以下数组中出现次数最多的元素:

3, 2, 4, 1, 5, 5, 5, 5, 1, 2, 2, 1, 1, 4, 5, 6, 2, 3

我们可以使用如下代码运行程序:

// 读入数组
int arr[] = {3, 2, 4, 1, 5, 5, 5, 5, 1, 2, 2, 1, 1, 4, 5, 6, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);

// 统计元素个数
for (int i = 0; i < n; i++) {
    int key = arr[i];
    hash[key]++;
}

// 找出出现次数最多的若干个元素
traverseHash();

// 输出结果
// 出现次数最多的元素:
// 1(5次):3 8 11 12 13 
// 2(4次):1 9 10 16 
// 5(4次):4 5 6 7 
// 4(2次):2 14 
// 3(2次):0 17 
// 6(1次):15 

程序输出了出现次数最多的若干个元素以及它们在数组中的位置。

示例 2

假设我们要查找用户输入的数组中出现次数最多的元素,我们可以使用如下代码:

// 读入数组
#define MAX_SIZE 100
int arr[MAX_SIZE];
int n;
printf("请输入数组大小(不超过 %d):", MAX_SIZE);
scanf("%d", &n);
printf("请输入数组元素:");
for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
}

// 统计元素个数
for (int i = 0; i < n; i++) {
    int key = arr[i];
    hash[key]++;
}

// 找出出现次数最多的若干个元素
traverseHash();

// 输出结果
// 出现次数最多的元素:
// ...

程序会提示用户输入数组的大小以及元素,然后输出出现次数最多的若干个元素以及它们在数组中的位置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C程序 查找数组中常见元素 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • php封装的数据库函数与用法示例【参考thinkPHP】

    下面是详细讲解“php封装的数据库函数与用法示例【参考thinkPHP】”的完整攻略。 1. 什么是php封装的数据库函数? 在php中,我们可以使用一些类和函数来操作数据库,但是这些操作可能会比较繁琐和冗长。因此,我们可以对这些操作进行封装,方便我们使用。封装后的数据库函数可以提供简便的操作方式,使代码更加易读、易维护,也更利于模块化和复用性。 2. ph…

    C 2023年5月23日
    00
  • C++使用宏函数实现单例模板详解

    下面就为你详细讲解“C++使用宏函数实现单例模板详解”的完整攻略。 1. 单例模式简介 单例模式是一种创建型设计模式,它确保某个类只有一个实例,并提供一个全局访问点,使得该实例能够被访问。单例模式在很多场景下都有非常重要的作用,例如线程池、配置文件读取等。 2. 使用宏函数实现单例模板 C++中使用宏函数可以方便地实现单例模板。具体实现步骤如下: 定义一个模…

    C 2023年5月23日
    00
  • .net core如何在网络高并发下提高JSON的处理效率详解

    首先,针对提高JSON的处理效率,我们可以从以下几方面入手: 选取高性能的JSON库 .NET Core自带了一个 Newtonsoft.Json 库,能够满足一般的需求,在处理一些复杂JSON数据时,可能会出现性能瓶颈。这时可以考虑使用其他的高性能JSON库,比如 Utf8Json、System.Text.Json等等。在具体应用时,可以对比测试不同库的性…

    C 2023年5月23日
    00
  • C++基础入门教程(一):基础知识大杂烩

    让我来详细讲解一下“C++基础入门教程(一):基础知识大杂烩”的完整攻略。 一、课程介绍 本教程主要介绍了C++的基础知识,包括了数据类型、变量、常量等基本概念,注重实践,涉及大量的代码示例。通过学习本教程,读者可以初步了解C++编程,并进一步深入学习C++。 二、目录 本教程的目录如下: 数据类型 常量和变量 运算符 选择结构 循环结构 数组 函数 标准输…

    C 2023年5月24日
    00
  • 雅虎公司C#笔试题(后半部份才是)

    “雅虎公司C#笔试题(后半部份才是)”是一道常见于程序员面试和笔试的题目。下面就从如何解题的角度,为大家讲解完整攻略。 题目描述 题目大意是给出两个字符串,求它们在其中一个字符串中的最长公共子串。 具体需要完成的是,实现一个方法 string Find(string str1, string str2, string source),其中: 参数 str1 …

    C 2023年5月23日
    00
  • Python实现打砖块小游戏代码实例

    Python实现打砖块小游戏代码实例 1. 简介 本文将介绍如何使用Python编写一个简单的打砖块小游戏代码,该代码使用Pygame库实现。 2. 环境搭建 在开始编写代码之前,我们需要安装Pygame库。这可以通过以下命令在终端中执行来安装: pip install pygame 3. 初始化 我们首先需要导入所需的库和模块,例如: import sys…

    C 2023年5月22日
    00
  • 深入理解C语言内存对齐

    深入理解C语言内存对齐 1. 概述 内存对齐是C语言中的一个重要概念。在C语言中,变量的地址是按照一定的规则分配的,变量的大小和类型都会影响内存的分配。因此,我们需要了解C语言内存对齐的原理以及规则。 2. 原理 C语言内存对齐的原理是为了提高存储器访问效率。由于计算机访问内存的速度较慢,为了使CPU能够尽快地访问数据,需要进行内存对齐。内存对齐的目的是使数…

    C 2023年5月23日
    00
  • C++ 简单的任务队列详解

    C++ 简单的任务队列详解 本文介绍了在 C++ 中实现一个简单的任务队列,用来处理异步任务。任务队列常用于多线程编程中,能够提高程序的并发性能。在本文中,我们将详细介绍任务队列的实现思路和步骤。 实现思路 任务队列是一个先进先出(FIFO)的数据结构,通常实现方式是使用队列。任务队列中存储的是待执行的任务。每当一个任务完成后,就从队列中取出下一个任务执行。…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部