#include<stdio.h>
//快排
int quickSort(int a[],int low,int high){
//int low=0,high=len-1;
int pivotkey=a[low];
while(low<high){
while(low<high&&a[high]<=pivotkey) --high;
a[low]=a[high];
while(low<high&&a[low]>=pivotkey) ++low;
a[high]=a[low];
}
a[low]=pivotkey;
return low;
}
//快排的优化 由于这里只需要找出中位数,不需要全部排序 so
int Qsort2(int a[],int low,int high,int len){
if(low<high){
int temp=quickSort(a,low,high);
if(temp<(len)/2){
//中位数在右边
return quickSort(a,temp+1,high);
}else if(temp>(len)/2){
//中位数在左边
return quickSort(a,low,temp);
}else{
//刚好为中位数
return temp;
}
}
}
//快排的递归
void Qsort(int a[],int low,int high){
if(low<high){
int temp=quickSort(a,low,high);
Qsort(a,low,temp);
Qsort(a,temp+1,high);
}
}
//根据如果减去两个不同的数,主元素不变 O(n)
void findMainNum5(int a[],int len){
int result=a[0];
int num=1;
for(int i=0;i<len;i++){
if(num==0){
result=a[i];
num=1;
}
if(a[i]==result){
num++;
}else{
num--;
}
}
num=0;
for(int i=0;i<len;i++){
if(a[i]==result){
num++;
}
}
if(num>len/2){
printf("主要元素是%d,次数为%d",result,num);
}else{
printf("没有主要元素");
}
}
//对快排的优化
void findMainNum4(int a[],int len){
int result=Qsort2(a,0,len-1,len);
int num=0;
for(int i=0;i<len;i++){
if(a[i]==a[result]){
num++;
}
}
if(num>len/2){
printf("主要元素是%d,次数为%d",a[result],num);
}else{
printf("没有主要元素");
}
}
//普通解法 O(n^2)
void findMainNum2(int a[],int len){
int b[len];
for(int i=0;i<len;i++){
b[i]=0;
for(int j=0;j<len;j++){
if(a[i]==a[j]){
b[i]++;
}
}
}
int max=0;
for(int i=1;i<len;i++){
if(b[i]>b[max]){
max=i;
}
}
if(b[max]>(len/2))
printf("主要元素是%d,次数为%d",a[max],b[max]);
else{
printf("没有主要元素");
}
}
//排序解法,利用快排,若有主要元素,则主要元素必然在中间,计算一下个数是否超过一半即可,快排达到O(nlogn)
void findMainNum3(int a[],int len){
Qsort(a,0,len-1);
int result=a[len/2];
int num=0;
for(int i=0;i<len;i++){
if(a[i]==result){
num++;
}
}
if(num>len/2){
printf("主要元素是%d,次数为%d",result,num);
}else{
printf("没有主要元素");
}
}
//求解数组中主要元素
void findMainNum(int a[],int len){
int b[len/2+1];
int num=0;
for(int i=0;i<len;i+=2){
if(i+1<len){
if(a[i]==a[i+1]){
b[num++]=a[i];
}
}else{
b[num++]=a[i];
}
}
if(num>2){
findMainNum(b,num);
}else if(num==2){
if(b[0]==b[1]){
printf("主要元素是:%d",b[0]);
}else{
printf("没有主要元素");
}
}else{
printf("主要元素是%d ",b[0]);
}
}
int main(){
int a[]={3,3,4,2,4,3,2,4,3,3,3};
findMainNum5(a,sizeof(a)/sizeof(int));
}
主元素问题
最新推荐文章于 2021-06-11 08:49:45 发布