C语言实现TopK

说明

由快速排序的衍生.

代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 30

int arr[MAX];

void quickSort(int arr[], int start, int end, int top);
int getIndex(int arr[], int start, int end);

int main(){
   
	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个使用C语言实现哈夫曼编码的示例代码。在这个示例中,我们将使用一个结构体来表示哈夫曼树的节点,以及一个数组来存储每个字符对应的编码。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TREE_HT 100 #define MAX_CHAR 256 // 哈夫曼树节点 struct node { char data; unsigned freq; struct node *left, *right; }; // 哈夫曼编码 struct code { char c; char bits[MAX_TREE_HT]; }; // 创建一个新的哈夫曼树节点 struct node* new_node(char data, unsigned freq) { struct node* node = (struct node*)malloc(sizeof(struct node)); node->left = node->right = NULL; node->data = data; node->freq = freq; return node; } // 交换两个哈夫曼树节点 void swap_node(struct node **a, struct node **b) { struct node *tmp = *a; *a = *b; *b = tmp; } // 将哈夫曼树节点按照频率排序 void sort_node(struct node **arr, int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j]->freq > arr[j+1]->freq) { swap_node(&arr[j], &arr[j+1]); } } } } // 构建哈夫曼树 struct node* build_tree(char *data, int *freq, int n) { struct node *left, *right, *top; struct node *arr[MAX_CHAR]; int i, j, k; // 将每个字符作为一个叶子节点 for (i = 0; i < n; i++) { arr[i] = new_node(data[i], freq[i]); } // 直到只剩下一个节点 while (n > 1) { // 排序节点 sort_node(arr, n); // 取出频率最小的两个节点 left = arr[0]; right = arr[1]; // 创建一个新节点作为它们的父节点 top = new_node('$', left->freq + right->freq); top->left = left; top->right = right; // 将新节点插入到数组中 arr[0] = top; for (j = 1; j < n - 1; j++) { arr[j] = arr[j+1]; } n--; } return arr[0]; } // 根据哈夫曼树获取每个字符的编码 void get_codes(struct node *root, char *bits, int top, struct code *codes) { if (root->left) { bits[top] = '0'; get_codes(root->left, bits, top+1, codes); } if (root->right) { bits[top] = '1'; get_codes(root->right, bits, top+1, codes); } if (!root->left && !root->right) { codes[root->data].c = root->data; memcpy(codes[root->data].bits, bits, top); codes[root->data].bits[top] = '\0'; } } // 哈夫曼编码 void huffman_encode(char *data, int *freq, int n, struct code *codes) { struct node *root; char bits[MAX_TREE_HT]; int top = 0; // 构建哈夫曼树 root = build_tree(data, freq, n); // 获取每个字符的编码 get_codes(root, bits, top, codes); } int main() { char data[] = "ABBCCCDDDDEEEEE"; int freq[MAX_CHAR] = {0}; int n = strlen(data); struct code codes[MAX_CHAR] = {0}; int i; // 计算每个字符在电文中出现的频率 for (i = 0; i < n; i++) { freq[data[i]]++; } // 哈夫曼编码 huffman_encode(data, freq, n, codes); // 打印每个字符的编码 for (i = 0; i < MAX_CHAR; i++) { if (codes[i].c != '\0') { printf("'%c': %s\n", codes[i].c, codes[i].bits); } } return 0; } ``` 这个示例中,我们首先计算每个字符在电文中出现的频率,然后使用`build_tree`函数构建哈夫曼树。接着,我们使用`get_codes`函数获取每个字符的编码,最后打印出每个字符的编码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值