package java1; import java.util.Scanner; public class Java1 { //定义一个全局变量sum存储重数 static int sum=0; //定义全局变量zhongshu储存众数 static String zhongshu=""; //count统计中间数出现的次数 public static int count(String a[],int p,int q){ //中间数 String n=a[(p+q)/2]; //初始化中间数次数 int counts=0; //从第一个索引到最后一个索引统计的中间数出现次数 for(int i=p;i<q;i++){ if(a[i]==n){ counts++; } } return counts; } //定义一个方法,用于返回当前数组的中间数第一次出现位置的索引, //参数p为当前数组第一个数的位置索引,q为最后一个索引 public static int start(String a[],int p,int q){ int x=0; for(int i=p;i<p;i++){ //找到第一个与中间数相同的数就停下,并返回 if(a[i]==a[(p+q)/2]){ x=i; break; } } return x; } public static void mode(String a[],int p,int q){ //当前数组中间数索引 int tnum=(p+q)/2; //统计中间数的重数 int tsum=count(a,p,q); int left=start(a,p,q); if(tsum>sum){ sum=tsum; zhongshu=a[tnum]; } //从右边开始找 left+tsum-q if(q-(left+tsum)>sum){ mode(a,left+tsum,q); } //从左边开始找 0-left if(left>sum){ mode(a,0,left); } } public static void main(String[] args) { /* 给定含有N个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数, 多重集合S中重数最大的元素称为多重集合S的众数,众数的重数称为多重集合S的重数, 试求一个给定多重结合的重数和众数; 例如:S={a,b,b,b,f,f,4,5}的重数是3,众数是b */ //定义测试数据组数n,多重集S中元素的个数为m //int n,m; //声明存储数据的数组 String a[]; //为数组中每个元素开辟空间 a=new String[]{"e","1","e","f","e","4","f"}; mode(a,0,7); System.out.println("众数为:"+zhongshu+" "+"重数为:"+sum); } }
代码错误提示
昨天我没描述详细,这个代码是用分治法求众数,代码的思路是:
(1)快速排序
(2)求中位数
(3)计算出中位数的最左端和最右端的位置,然后分割成2段数组
(4)中位数个数与左端个数比较,中<左 即最大众数可能存在左端,将左端再进行2段分割(递归)直到 中 > 左为止
右端同理。。。
你得告诉我们运行时出了什么样的错啊
补充了问题了,麻烦再帮我看看
@野心家:
递归搞成了死循环,检查 mode内部 调用自身的两个条件
@西漠以西: 恩恩,谢谢啦,我检查一遍
@西漠以西: 死循环问题解决了,谢谢啦问题
把错误代码贴上来
补充了问题了,麻烦了