主元素问题(C语言)

主元素问题(C语言)

题目


参考代码

#include <stdio.h>

// 快速排序函数,复杂度低,冒泡排序需要o(n^2)
void quickSort(int arr[], int left, int right)
{
    int i = left, j = right;
    int pivot = arr[(left + right) / 2];
    while (i <= j)
    {
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j)
        {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
        quickSort(arr, i, right);
}

int main()
{
    int n, s[400002], num = 1, max = 0, maxNum = 0; // max主元素,maxNum主元素出现次数
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &s[i]);

    // 使用快速排序
    quickSort(s, 0, n - 1);

    int m;
    for (m = 1; m < n; m++)
    {
        if (s[m] == s[m - 1])
            num++;
        else
        {
            if (num > (n / 2)) // 只可能存在一个数大于n/2(剩下最多1-n/2)
            {
                max = s[m - 1];
                maxNum = num;
                break;
            }
            num = 1;
        }
    }

    // 处理最后一个元素,刚好n++超过n/2, 但跳出循环,没有给max maxNum赋值的情况
    if (maxNum == 0 && num > n / 2)
    {
        max = s[n - 1];
        maxNum = num;
    }

    if (maxNum > 0 || num > n / 2)
        printf("%d", max);
    else
        printf("0");
    return 0;
}
posted @ 2024-08-31 19:16  yesno233233  阅读(46)  评论(0)    收藏  举报