C语言之众数

#include<stdio.h>
int main()
{
	int numbers[10] = {1,2,3,1,2,3,4,5,6,1};
	int counts[10] = { 0 };

	int count = 0;
	int i, j;
	for (i = 0; i < 10; i++)//记录每个数字的出现的个数 
	{
		for (j = 0; j < 10; j++)
		{
			if (numbers[i] == numbers[j])
				count++;
		}
		counts[i] = count;//保存
		count = 0;
	}

	int maxIndex = 0;
	for (i = 1; i < 10; i++)//查询最多的数字
	{
		if (counts[i] > counts[maxIndex])
			maxIndex = i;
	}
	
	int maxCount = counts[maxIndex];

	if (maxCount == 1)
	{
		printf("众数不存在!\n");
	}
	else {
		for (i = 0; i < 10; i++)//去重(去掉同个数字)
		{
			for (j = 0; j < 10; j++)
			{
				if (i != j && numbers[i] == numbers[j] && counts[i] == maxCount)
				{
					counts[j] = 0;
				}
			}
		}

		for (i = 0; i < 10; i++)//输出
		{
			if (counts[i] == maxCount)
			{
				printf("%d\t",numbers[i]);
			}
		}
	}

	system("pause");//调用系统的暂停函数
	return 0;
}

 

求一个数组中的众数和重数可以使用分治算法来实现。分治算法是将问题分解成多个子问题,然后递归求解这些子问题,最后将子问题的结果合并起来得到原问题的解。 下面是使用分治算法求一个数组中的众数和重数的C语言实现代码: ```c #include <stdio.h> // 求众数和重数 void majority(int a[], int l, int r, int *num, int *cnt) { if (l == r) { // 数组中只有一个元素 *num = a[l]; *cnt = 1; return; } int mid = (l + r) / 2; int left_num, left_cnt; majority(a, l, mid, &left_num, &left_cnt); // 递归求解左半部分 int right_num, right_cnt; majority(a, mid + 1, r, &right_num, &right_cnt); // 递归求解右半部分 if (left_num == right_num) { // 左右两部分的众数相同 *num = left_num; *cnt = left_cnt + right_cnt; } else { // 左右两部分的众数不同 int left_cnt2 = 0; for (int i = l; i <= mid; i++) { if (a[i] == left_num) { left_cnt2++; } } int right_cnt2 = 0; for (int i = mid + 1; i <= r; i++) { if (a[i] == right_num) { right_cnt2++; } } if (left_cnt2 > right_cnt2) { *num = left_num; *cnt = left_cnt2; } else { *num = right_num; *cnt = right_cnt2; } } } int main() { int a[] = { 1, 2, 3, 3, 3, 4, 4, 5, 5 }; int num, cnt; majority(a, 0, 8, &num, &cnt); printf("众数是%d,重数是%d\n", num, cnt); return 0; } ``` 在这个实现中,majority函数是递归求解众数和重数的函数。它将数组分成左右两部分,分别递归求解左右两部分的众数和重数,然后合并这些结果。如果左右两部分的众数相同,那么就直接返回这个众数和它在整个数组中的重数。如果左右两部分的众数不同,那么就在左右两部分中分别计算这些众数在对应部分中的出现次数,然后返回出现次数更多的那个众数和它在整个数组中的重数。 上述代码的时间复杂度为O(nlogn),其中n是数组中的元素个数。这个算法的空间复杂度是O(logn),因为它是一个递归算法,递归深度是O(logn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值