【揭秘C语言数组中的众数】轻松掌握寻找多数元素的高效技巧

发布时间:2025-05-23 00:32:50

概述

在数据分析跟算法范畴,众数是一个重要的不雅点,它表示一组数据中呈现频率最高的数值。在C言语中,寻觅数组中的众数是一个罕见的成绩。本文将探究多少种在C言语中寻觅众数的方法,并分析它们的优毛病。

方法一:统计频率法

统计频率法是一种直不雅且简单的方法。其基本思绪是遍历数组,记录每个元素呈现的次数,然后找出呈现次数最多的元素。

实现步调

  1. 初始化一个与数组大小雷同的计数数组,用于记录每个元素呈现的次数。
  2. 遍历原数组,对每个元素在计数数组中对应的地位加一。
  3. 遍历计数数组,找出最大年夜值及其对应的元素。

示例代码

#include <stdio.h>
#define MAX 100 // 假设数组中元素的最大年夜值为100

int findMode(int arr[], int size) {
    int frequency[MAX] = {0}; // 初始化频率数组
    int i, maxFrequency = 0, mode = 0;
    // 记录频率
    for (i = 0; i < size; i++) {
        frequency[arr[i]];
    }
    // 找到最大年夜频率对应的元素
    for (i = 0; i < MAX; i++) {
        if (frequency[i] > maxFrequency) {
            maxFrequency = frequency[i];
            mode = i;
        }
    }
    return mode;
}

int main() {
    int arr[] = {1, 3, 3, 2, 5, 3, 2, 2, 2, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int mode = findMode(arr, size);
    printf("The mode of the array is %d\n", mode);
    return 0;
}

优毛病

  • 长处:简单直不雅,易于懂得。
  • 毛病:时光复杂度为O(n),当数组很大年夜时效力较低。

方法二:排序法

排序法的基本思绪是将数组排序,然后直接找到旁边的元素。这种方法在数组已排序的情况下非常高效。

实现步调

  1. 对数组停止排序。
  2. 前去下标为[n/2]的元素。

示例代码

#include <stdio.h>
#include <stdlib.h>

int majorityElement(int* nums, int numsSize) {
    int* sorted = (int*)malloc(numsSize * sizeof(int));
    memcpy(sorted, nums, numsSize * sizeof(int));
    qsort(sorted, numsSize, sizeof(int), (int(*) (const void*, const void*))strcmp);
    return sorted[numsSize / 2];
}

int main() {
    int arr[] = {1, 2, 2, 3, 2, 2, 5, 3, 2, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int mode = majorityElement(arr, size);
    printf("The mode of the array is %d\n", mode);
    return 0;
}

优毛病

  • 长处:时光复杂度为O(n log n),对已排序的数组非常高效。
  • 毛病:须要额定的内存空间,且排序过程可能较慢。

方法三:Boyer-Moore投票算法

Boyer-Moore投票算法是一种在未排序数组中寻觅众数的有效方法,其时光复杂度为O(n)。

实现步调

  1. 假设数组中有众数,那么它可能抵消掉落其他全部数。
  2. 遍历数组,记录以后候选众数及其呈现次数。
  3. 假如以后元素等于候选众数,增加计数;不然,增加计数。
  4. 假如计数为0,则调换候选众数。

示例代码

#include <stdio.h>

int findMode(int* nums, int numsSize) {
    int mode = nums[0];
    int count = 1;
    for (int i = 1; i < numsSize; i++) {
        if (nums[i] == mode) {
            count++;
        } else {
            count--;
        }
        if (count == 0) {
            mode = nums[i];
            count = 1;
        }
    }
    return mode;
}

int main() {
    int arr[] = {1, 2, 2, 3, 2, 2, 5, 3, 2, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int mode = findMode(arr, size);
    printf("The mode of the array is %d\n", mode);
    return 0;
}

优毛病

  • 长处:时光复杂度为O(n),不须要额定的内存空间。
  • 毛病:在数组不众数或众数呈现次数不是数组大小的一半时,该方法有效。

总结

本文介绍了三种在C言语中寻觅众数的方法:统计频率法、排序法跟Boyer-Moore投票算法。每种方法都有其优毛病,抉择合适的方法取决于具体的利用处景。在现实编程中,我们可能根据现真相况抉择最合适的方法。