📄 junzhi.cpp
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include <ctime>
#include<math.h>
#define TRUE 1
#define FALSE 0
int N;
int K;
int * CenterIndex;
double * Center;
double * CenterCopy;
double * AllData;
double ** Cluster;
int * Top;
void CreateRandomArray(int n, int k,int * center)
{
int i=0;
int j=0;
srand((unsigned)time(NULL));
for( i=0;i<k;++i)
{
int a=rand()%n;
for(j=0;j<i;j++)
{
if(center[j]==a)
{
break;
}
}
if(j>=i)
{
center[i]=a;
}
else
{
i--;
}
}
}
int GetIndex(double value,double * center)
{
int i=0;
int index=i;
double min=fabs(value-center[i]);
for(i=0;i<K;i++)
{
if(fabs(value-center[i])<min)
{
index=i;
min=fabs(value-center[i]);
}
}
return index;
}
void CopyCenter()
{
int i=0;
for(i=0;i<K;i++)
{
CenterCopy[i]=Center[i];
}
}
void InitCenter()
{
int i=0;
CreateRandomArray(N,K,CenterIndex);
for(i=0;i<K;i++)
{
Center[i]=AllData[CenterIndex[i]];
}
CopyCenter();
}
void AddToCluster(int index,double value)
{
Cluster[index][Top[index]++]=value;
}
void UpdateCluster()
{
int i=0;
int tindex;
for(i=0;i<K;i++)
{
Top[i]=0;
}
for(i=0;i<N;i++)
{
tindex=GetIndex(AllData[i],Center);
AddToCluster(tindex,AllData[i]);
}
}
void UpdateCenter()
{
int i=0;
int j=0;
double sum=0;
for(i=0;i<K;i++)
{
sum=0;
for(j=0;j<Top[i];j++)
{
sum+=Cluster[i][j];
}
if(Top[i]>0)
{
Center[i]=sum/Top[i];
}
}
}
int IsEqual(double * center1 ,double * center2)
{
int i;
for(i=0;i<K;i++)
{
if(fabs(center1[i]!=center2[i]))
{
return FALSE;
}
}
return TRUE;
}
void Print()
{
int i,j;
printf("-------------------------------------- ");
for(i=0;i<K;i++)
{
printf("第%d组群域: 群心(%f) ",i,Center[i]);
for(j=0;j<Top[i];j++)
{
printf("%f ",Cluster[i][j]);
}
}
}
void InitData()
{
int i=0;
int a;
printf("输入数据个数: ");
scanf("%d",&N);
printf("输入域个数: ");
scanf("%d",&K);
if(K>N)
{
exit(0);
}
Center=(double *)malloc(sizeof(double)*K);
CenterIndex=(int *)malloc(sizeof(int)*K);
CenterCopy=(double *)malloc(sizeof(double)*K);
Top=(int *)malloc(sizeof(int)*K);
AllData=(double *)malloc(sizeof(double)*N);
Cluster=(double **)malloc(sizeof(double *)*K);
for(i=0;i<K;i++)
{
Cluster[i]=(double *)malloc(sizeof(double)*N);
Top[i]=0;
}
printf("输入%d数据:",N);
for(i=0;i<N;i++)
{
scanf("%d",&(a));
AllData[i]=a;
}
InitCenter();
UpdateCluster();
}
void main()
{
int Flag=1;
int i=0;
InitData();
while(Flag)
{
UpdateCluster();
UpdateCenter();
if(IsEqual(Center,CenterCopy))
{
Flag=0;
}
else
{
CopyCenter();
}
}
Print();
getchar();
getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -