#include<stdio.h>
#include<stdlib.h> // standard_library
int* GetMode(int *data,int data_lenth,int low,int high){
//data是输入数据,data_lenth是元素的个数,
//low是开始寻找的左侧下标,high为开始寻找的右侧下标
//函数返回一个含有两个元素的数组,分别记录众数和重数。
int *p = (int*)malloc(sizeof(int)*2);
//递归函数边界条件,当只有一个元素时,元素的众数是他本身,重数是1.
p[0] = data[low];
p[1] = 1;
//选出基准数,将较小者置于左侧,较大者置于右侧,统计基准数的重数
if(low<high){
int pkey = data[low],t;// 基准数默认选取最左侧数,重数默认是1
//将较小者置于左侧,较大者置于右侧,相当于进行一轮快速排序
int low2=low,high2 = high;
while(low2<high2){
while(low2<high2&&data[high2]>=pkey){
if(data[high2]==pkey)p[1]++; // 记录基准数的众数
high2--;
}
data[low2] = data[high2];
while(low2<high2&&data[low2]<=pkey){
if(data[low2]==pkey)p[1]++; // 记录基准数的众数
low2++;
}
data[high2] = data[low2];
}
data[low2] = pkey;
int ploc = low2;
int *p2 = GetMode(data,data_lenth,low,ploc-1); //左部分众数
int *p3 = GetMode(data,data_lenth,ploc+1,high); //右部分众数
//在左右部分众数和基准数中,选取重数最大
if(p2[1] > p3[1]);
else p2 = p3;
if(p[1] > p2[1]);
else p = p2;
}
return p;//以指针形式返回结果
}
int main(){
int n;
printf("n=");
scanf("%d",&n);//记录集合的总元素个数
int *arr = (int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);//输入集合元素
}
int *p = GetMode(arr,n,0,n-1);// 调用递归函数
printf("------\n%d\n%d\n",p[0],p[1]);//输出结果
return 0;
}
1完全去去b
最新推荐文章于 2024-07-11 16:48:43 发布