- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX 200
- long a[MAX],a1[MAX];
- char str[100001];
- long n,length;
- void Exchange(long *a,long *b)
- {
- long temp=*a;
- *a=*b;
- *b=temp;
- }
- void Min_Heapify(long a[],long i)//保持最小堆性
- {
- long l=i*2,r=i*2+1,min;
- if(l<=length&&a[l]<a[i])
- min=l;
- else
- min=i;
- if(r<=length&&a[r]<a[min])
- {
- min=r;
- }
- if(min!=i)
- {
- Exchange(&a[i],&a[min]);
- Min_Heapify(a,min);
- }
- }
- void Build_Min_Heap(long a[])//建堆
- {
- int i;
- for(i=length/2;i>=1;i--)
- {
- Min_Heapify(a,i);
- }
- }
- void HeapSort(long a[])//堆排序
- {
- long i;
- Build_Min_Heap(a);//堆一次,即每次取最小值
- /*for(i=n;i>=2;i--)
- {
- Exchange(&a[1],&a[length]);
- length-=1;
- Max_Heapify(a,1);
- }*/
- }
- int main()
- {
- long i,j;
- scanf("%s",str);
- memset(a,0,sizeof(a));
- memset(a1,0,sizeof(a1));
- for(i=0;str[i];++i)
- {
- if((str[i]>='A')&&(str[i]<='Z'))
- {
- ++a1[str[i]-'A'+1];
- }
- else
- {
- ++a1[str[i]-'a'+27];
- }
- }
- for(i=1,j=1;i<=55;++i)
- {
- if(a1[i]>0)
- {
- a[j++]=a1[i];
- }
- }
- length=j-1;
- n=length;
- long x,y,tp,sum=0;
- if(n==1)
- {
- printf("%d\n",a[1]);
- return 0;
- }
- for(i=1;i<=n-1;++i)
- {
- HeapSort(a);
- x=a[1];
- tp=a[1];
- a[1]=a[length];
- a[length]=tp;
- --length;
- HeapSort(a);
- y=a[1];
- a[1]=x+y;
- sum+=a[1];
- }
- printf("%ld\n",sum);
- /*for(i=1;i<=n;++i)
- {
- printf("%d ",a[i]);
- }*/
- return 0;
- }
xmu-1315 哈夫曼编码问题
最新推荐文章于 2023-11-19 10:44:40 发布
本文介绍了一种使用堆排序算法进行字符频率统计的方法。通过对输入字符串中的字符计数,并利用最小堆保持频率的有序性,实现了高效地计算字符出现次数总和的功能。文章详细展示了如何构建最小堆并进行堆排序。
3765

被折叠的 条评论
为什么被折叠?



