#include <stdio.h>
#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;// ,
// k x(0<=x<=n-1)
void CreateRandomArray(int n, int k,int * center)
{
int i=0;
int j=0;
srand( (unsigned)time( NULL ) );
for( i=0;i<k;++i)// k
{
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);// K <N
for(i=0;i<K;i++)
{
Center[i]=AllData[CenterIndex[i]];//
}
CopyCenter();//
}
// Cluster[index]
void AddToCluster(int index,double value)
{
Cluster[index][Top[index]++]=value;//
}
//
void UpdateCluster()
{
int i=0;
int tindex;
// , TOP 0
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;
// i
for(j=0;j<Top[i];j++)
{
sum+=Cluster[i][j];
}
if(Top[i]>0)//
{
Center[i]=sum/Top[i];//
}
}
}
// 2
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);//
// 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();// K
}
/*
:
K :
K, N K ,
, 。
*/
main()
{
int Flag=1;// , false,
int i=0;
InitData();//
while(Flag)//
{
UpdateCluster();//
UpdateCenter();//
if(IsEqual(Center,CenterCopy))// , ,
{
Flag=0;
}
else//
{
CopyCenter();//
}
}
Print();//
getchar();
getchar();
}