分治法之求众数

1.众数

/*
分治法求解众数问题,返回众数及其重数
url:https://www.cnblogs.com/yangykaifa/p/7162192.html
    https://www.cnblogs.com/pprp/p/9688481.html
每次查中间数出现的次数 
*/
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
void get(int arr[],int len,int &left,int &right)
{
	int mid=len/2;
	for(left=0;left<len;left++)
		if(arr[left]==arr[mid])
			break;
	for(right=left+1;right<len;right++)
		if(arr[right]!=arr[mid])
			break;
}
void getval(int arr[],int len,int &val,int &count)
{
	int left,right;
	get(arr,len,left,right);
	int temp=arr[len/2];
	int num=right-left;
	if(num>count)
	{
		count=num;
		val=temp;
	}
	if(left+1>count)
		getval(arr,left+1,val,count);
	if(len-right>count)
		getval(arr,len-right,val,count);
}
int main()
{
	int arr[]={1,2,3,3,3,4,9,6,7,7,7,7,9,5,10,10,12,
              12,14,14,15,14,31,23,5,23,4,43,3,2,3,4
              ,3,2,1,1,34,2,3,2,2,2,22,0,2,12,5,5,5,
              5,5,5,5,6,5};
    int len=sizeof(arr)/sizeof(int);
	sort(arr,arr+len);                  //排序后,众数就是挨着的 
	int val,count=0;
	for(int i=0;i<len;i++)
		cout<<arr[i]<<" ";
	getval(arr,len,val,count);
	cout<<endl<<"众数:"<<val<<endl<<"重数:"<<count; 
	return 0; 
}

在这里插入图片描述

发布了63 篇原创文章 · 获赞 3 · 访问量 1716

猜你喜欢

转载自blog.csdn.net/qq_34405401/article/details/103150199