软件基础实践 | 众数问题(分治法)

mac2024-10-10  52

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; }
最新回复(0)