1.问题描述:
给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数,多重 集合 S 中重数最大的元素称为众数。例如,S={1, 2 ,2 ,2 ,3 ,5}。多重集合 S 的众数是 2,其重数为 3。
2.算法设计:
对于给定的由 n 个自然数组成的多重集合 S,计算 S 的众数及其重数。
数据输入:输入多重集 S。
数据输出:输出众数及重数。
例:
输入: 6 1 2 2 2 3 5 2 3
输出: 2 4
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
int a[100];//重数
int b[100];//众数
int zhongshu(int array[], int k, int m, int l)
{
int i, j;
int mid;
mid = (k + m) / 2;
i = mid + 1;
j = mid;
while (array[i] == array[mid]) //右边分治
{
i++;
a[l]++;
b[l] = array[mid];
}
while (array[j] == array[mid]) //左边分治
{
j--;
a[l]++;
b[l] = array[mid];
}
if (j + 1 < a[l] && m - i < a[l])
{
return l;
}
if (j + 1 < a[l] && m - i > a[l])
{
l++;
zhongshu(array, i, m, l);
}
if (j + 1 > a[l] && m - i < a[l]) {
l++;
zhongshu(array, 0, j, l);
}
}
int main()
{
int n, i, l, k = 0;
int array[1000];
cin >> n;
for (i = 0; i < 100; i++)
{
a[i] = 0;
b[i] = 0;
}
for (i = 0; i < n; i++)
cin >> array[i];
sort(array, array + n); //排序
l = zhongshu(array, 0, n, 0);
for (i = 0; i < l; i++)
{
if (a[i] > a[0])
{
a[0] = a[i];
k = i;
}
}
printf("众数:%d , 重数:%d\n", b[k], a[k]); //a[]重数,b[]众数
system("pause");
return 0;
}