排序算法 c++(思想+code)

前言

最近在刷PAT甲级题目,遇到相应不熟的知识点而记之,以备考前回顾。

Insertion sort(直接插入排序)

思想:在一个长为n的数组中,前边一部分为已排序的数组,后面的为未排序的数组,每次遍历都从后面添加一个到前面中的合适位置。

code:

void insertion(int a[])
{
    for(int i=0;i<a.size();i++)
    {
        sort(a.begin(),a.begin()+i);
    }
}

Heap sort(堆排序)

思想:

将一个长为n的序列构造成一个大顶堆,则整个序列的最大值就是堆顶的根结点。 将最大值结点与末尾结点的值互换,此时末尾结点的值就是最大值。(即数组的最后一个元素为最大值)

然后将剩余的 n-1个序列重新构造成一个大顶堆,再将n-1序列的最大值与末尾结点的值互换,就会得到 次最大值。 如此重复执行,就可以得到一个有序序列了。

code:

void heap(int high)
{
    int i=1,j=i*2;
    while(j<=high)
    {
        if(j+1<=high&&a[j]<a[j+1]) j=j+1;   //如果右孩子存在并且右孩子比左孩子大,交换的元素就用右孩子来代替;
        if(a[i]>=a[j]) break;  //此时已经换到合适的位置了,所以退出
        swap(a[i],a[j]);
        i++;j=i*2;
    }
}


//默认数组a的元素从1开始放置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络传输压缩算法是一种用于减少数据传输量的技术,它通过对数据进行编码和解码来实现。其中,哈夫曼编码是一种常用的网络传输压缩算法之一。 在C++中,可以使用哈夫曼编码来实现网络传输压缩算法。下面是一个简单的示例代码: ```cpp #include <iostream> #include <queue> #include <map> using namespace std; // 定义哈夫曼树节点结构 struct HuffmanTreeNode { int weight; // 结点的权重 char value; // 结点的值 HuffmanTreeNode* LChild; // 结点的左孩子 HuffmanTreeNode* RChild; // 结点的右孩子 }; // 定义比较函数,用于优先队列的排序 struct Compare { bool operator()(HuffmanTreeNode* a, HuffmanTreeNode* b) { return a->weight > b->weight; } }; // 构建哈夫曼树 HuffmanTreeNode* buildHuffmanTree(map<char, int>& frequency) { priority_queue<HuffmanTreeNode*, vector<HuffmanTreeNode*>, Compare> pq; // 将每个字符的频率作为权重,构建叶子节点 for (auto it = frequency.begin(); it != frequency.end(); ++it) { HuffmanTreeNode* node = new HuffmanTreeNode(); node->weight = it->second; node->value = it->first; node->LChild = nullptr; node->RChild = nullptr; pq.push(node); } // 构建哈夫曼树 while (pq.size() > 1) { HuffmanTreeNode* left = pq.top(); pq.pop(); HuffmanTreeNode* right = pq.top(); pq.pop(); HuffmanTreeNode* parent = new HuffmanTreeNode(); parent->weight = left->weight + right->weight; parent->value = '\0'; parent->LChild = left; parent->RChild = right; pq.push(parent); } return pq.top(); } // 生成哈夫曼编码 void generateHuffmanCode(HuffmanTreeNode* root, map<char, string>& huffmanCode, string code) { if (root == nullptr) { return; } if (root->LChild == nullptr && root->RChild == nullptr) { huffmanCode[root->value] = code; } generateHuffmanCode(root->LChild, huffmanCode, code + "0"); generateHuffmanCode(root->RChild, huffmanCode, code + "1"); } int main() { // 假设有一个字符串需要进行压缩 string input = "hello world"; // 统计每个字符的频率 map<char, int> frequency; for (char c : input) { frequency[c]++; } // 构建哈夫曼树 HuffmanTreeNode* root = buildHuffmanTree(frequency); // 生成哈夫曼编码 map<char, string> huffmanCode; generateHuffmanCode(root, huffmanCode, ""); // 输出每个字符的哈夫曼编码 for (auto it = huffmanCode.begin(); it != huffmanCode.end(); ++it) { cout << it->first << ": " << it->second << endl; } return 0; } ``` 这段代码演示了如何使用C++实现哈夫曼编码的生成过程。首先,统计输入字符串中每个字符的频率,然后根据频率构建哈夫曼树。接下来,通过遍历哈夫曼树,生成每个字符的哈夫曼编码。最后,输出每个字符对应的哈夫曼编码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值