主元素问题(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;
}
浙公网安备 33010602011771号