哈弗曼编码
- 涉及哈弗曼树的建立
代码解决为,不断进行排序,选择最小的放在最前边,然后相加建立。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char str[2560];
int book[2560];
int tap[2560];
int cmp(const void *a, const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
while(scanf("%s", str)!=EOF)
{
memset(book, 0, sizeof(book));
memset(tap, 0, sizeof(tap));
int la, lb=0;
la=strlen(str)*8;
int i;
for(i=0;i<la;i++)
{
book[str[i]]++;
}
int p=0;
//for(i=0;i<256;i++)
for(i=45;i<256;i++)
{
if(book[i]!=0)
tap[p++]=book[i];
}
//printf("\n");
qsort(tap, p, sizeof(tap[0]), cmp);
int sum=0;
int q=0;
while(q<p-1)
{
tap[q+1]+=tap[q];
sum+=tap[q+1];
qsort(tap, p, sizeof(tap[0]), cmp);
q++;
}
lb=sum;
printf("%d %d %.1lf\n", la, lb, 1.0*la/lb);
}
return 0;
}
绝对不仅仅如此。
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;//这是从小到大排序,若是从大到小改成: return *(int *)b-*(int *)a;
}
int main()
{
int a[100];
int n;
scanf("%d",&n);//n代表数组中有几个数字
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i-1]);
qsort(a,n,sizeof(a[0]),cmp);//(数组,需要排序的数字个数,单个数字所占内存大小,比较函数)
for(i=1;i<=n;i++)
printf("%d ",a[i-1]);
return 0;
}