#include<stdio.h> #include<string.h> void countSort(int n,int *p); int Huffuman(int n,int *p); int main() { int n,i; int p[101]; int all; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&p[i]); } all=Huffuman(n,p); printf("%d",all); return 0; } int Huffuman(int n,int *p) { int i,j; int sum=0;//记录总费用 int q=0;//记录最小数的指向,当当前最小的置为0之后就移动位置 //可以控制循环次数为数组个数-1,因为每循环一次就少一个数 for (i=0; i<n-1; i++) { //1.如何找到数组中的两个最小的数?——先排序(采用计数排序) countSort(n,p); //2.将数组前两个相加并将最小位置为0,将第二小上面保存两个最小数的和 sum=sum+p[q]+p[q+1];//记录费用 p[q+1]=p[q]+p[q+1];//第二小的位置上保存两个最小的相加之后的结果 p[q]=0;//将最小的位置上置为0; q++;//q指向下一位 } return sum; } void countSort(int n,int *p) { int i; //先找到数组中的最大元素,以便给辅助数组定空间 int max=p[0]; int k=0; for(i=1; i<n; i++) { if(p[i]>=max) { max=p[i]; } } int help[max+1];//根据最大的元素来定义辅助数组的大小 //并且初始化将help数组中都为0 memset(help,0,sizeof(help)); for(i=0; i<n; i++) { //循环遍历原数组,将对应的元素传给辅助数组的下标 help[p[i]]++; } //扫描辅助数组,将元素不为0的下标按顺序返回给原数组 for(i=0; i<max+1; i++) { while(help[i]!=0) { p[k]=i; help[i]--; k++; } } }
原文:https://www.cnblogs.com/jessie99/p/12378117.html