哈弗曼编码

xiaoxiao2021-02-28  7

哈弗曼编码

涉及哈弗曼树的建立

代码解决为,不断进行排序,选择最小的放在最前边,然后相加建立。

#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; }
转载请注明原文地址: https://www.6miu.com/read-1100246.html

最新回复(0)