数据结构实验之二叉树六:哈夫曼编码 3345

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[500];
int q[1000], t[1000];
void arrange(int a[], int l, int r)//快排函数
{
    int x = a[l], i = l, j = r;
    if(i >= j)
        return;
    while(i < j)
    {
        while(i < j && a[j] >= x)
            j--;
        a[i] = a[j];
        while(i < j && a[i] <= x)
            i++;
        a[j] = a[i];
    }
    a[i] = x;
    arrange(a,l,i - 1);
    arrange(a,i+1,r);
}
int main()
{
  int len, i;
  while(~scanf("%s",s))
  {
      memset(t,0,sizeof(t));//数组t[]初始为0;
      int top = 0, rear = 0;
      len=strlen(s);
      int m = len*8;//ASCLL码值每位占8个字节;
      for(i = 0;i < len; i++)
        t[s[i]]++;    //记录下每个字符出现的次数;
      for(i =0 ; i < 500; i++)
      {
          if(t[i])
          {
              q[top++] = t[i];//把刚才记录的数放进q里并算出共有top-1个数;
          }
      }
      arrange(q,0,top-1);把这些数从小到大排序
      int sum = 0;
      int x1, x2;
      while(top != rear)
      {
           x1 = q[rear++];//最后一个的时候top是指在最后一个数的后面,此时rear指在最后一个数,

         //这样rear++就立刻不满足下面的条件,里面的sum也不会增加了
           if(top!=rear)
           {
               x2 = q[rear++];//为了让rear指向第三个数,进行排序
               sum +=x1+x2;
               q[top++] = x1+x2;//存放的是x1+x2,而不是sum
               arrange(q,rear,top-1);
           }
      }
      printf("%d %d %.1lf\n",m,sum,1.0*m/sum);
  }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/JKxiaoming/article/details/81665902