有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)...
解题思路:
排序方法:多路归并排序
每次将n个list的头元素取出来,进行排序(堆排序),最小元素从堆中取出后,将其所在list的下一个元素
放入堆中,调整堆序列。
函数实现原型:
void listnodesort(list<list<Node> >* listlistnode){}
#include <iostream> #include <list>using namespace std;struct Node{int value;Node *next = NULL; }; ///堆排序(调整堆) void HeapAdjust(Node* heap, int i, int length){int min = i;int lch = 2*i+1;int rch = 2*i+2;if(i <= (length-2)/2){if(lch < length && heap[min].value > heap[lch].value){min = lch;}if(rch < length && heap[min].value > heap[rch].value){min = rch;}if(min != i){swap(heap[min], heap[i]);HeapAdjust(heap, min, length);}} } ///堆排序(建堆) void BuildHeap(Node* heap, int length) { ///要确定好是-2,还是-1for(int i = (length-2)/2; i >=0; i--){ HeapAdjust(heap, i, length);} } ///主要排序函数 void listnodesort(list<list<Node> >* listlistnode) {list<Node> listTotal;int length = (*listlistnode).size();Node* heap = new Node[length];int i = 0;for(list<list<Node> >::iterator iter = (*listlistnode).begin(); iter !=(*listlistnode).end(); iter ++){heap[i] = (*iter).front();i++;}BuildHeap(heap, length);while(length>0){listTotal.push_back(heap[0]);if(length == 1){break;}if(heap[0].next == NULL){heap[0] = heap[length-1];length -=1;}else{heap[0] = *(heap[0].next);}HeapAdjust(heap, 0, length);}cout << "totalList: ";for(list<Node>::iterator it=listTotal.begin(); it!=listTotal.end(); it++){cout << (*it).value << " ";}cout << endl; }list<list<Node> > buildListList(int sum, int interval) {list<list<Node> > listlistnode;for(int i = 0; i<interval; i++){list<Node> listnode;///mode 1: startNode* node = new Node(); ///此处一定要用new分配一个内存,不能直接使用Node node;int j = i;while(j<sum){Node* nodeNext = new Node();node->value = j;if(j+interval > sum){node->next = NULL;}elsenode->next = nodeNext;listnode.push_back(*node);node = nodeNext;j+=interval;}///mode 1: end///mode2:start // int j = i; // Node* head = NULL; // Node* endp = NULL; // while(j<sum){ // Node* node = new Node(); // node->value = j; // node->next = NULL; // if(head == NULL){ // head = node; // endp = node; // } // else{ // endp->next = node; // endp = node; ///此处也不可忘了 // } // j=j+interval; // } // while(head != NULL){ // listnode.push_back(*head); // head = head->next; // }/// mode 2:end listlistnode.push_back(listnode);}return listlistnode; }void print(list<list<Node> > *listlistnode) ///到底是传值还是传指针,后续代码块中的操作也要做相应变动; {for(list<list<Node> >::iterator iter=(*listlistnode).begin(); iter != (*listlistnode).end(); iter++){list<Node> listnode = *iter; ///迭代器解地址后就是其内部所指内容for(list<Node>::iterator it=listnode.begin(); it!=listnode.end(); it++){cout << (*it).value << " ";}cout << endl;} }int main() {list<list<Node> > listlistnode = buildListList(39,9);print(&listlistnode);listnodesort(&listlistnode); ///根据函数的定义决定是传值还是传指针cout << "Hello world!" << endl;return 0; }
另外,还有一种更加简单的方法:借助map结构,因为map本身就是key有序的序列结构,所以将listlistnode中的所有元素依次加入map中即可完成排序。
map<int, int> mapNode;for(list<list<Node> >::iterator iter=listlistnode.begin(); iter != listlistnode.end(); iter++){list<Node> listnode = *iter;for(list<Node>::iterator it=listnode.begin(); it!=listnode.end(); it++){ ///如果不存在则插入,如果存在则key相应得value++即可。if(mapNode.count((*it).value)==0)mapNode.insert(pair<int, int> ((*it).value,1));else{mapNode[(*it).value]++;}}}for(map<int, int>::iterator it = mapNode.begin(); it!=mapNode.end(); it++){cout << it->first << " " << it->second << endl;}
转载于:https://www.cnblogs.com/lifeinsmile/p/5245695.html
有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)...相关推荐
- python列表元素统计ls_给定列表ls = [1, 2, 3, 1, 2, 3],其元素包含2种数据类型,哪个选项是列表ls的数据组织维度?...
[单选题]列表ls,哪个选项对ls.append(x)的描述是正确的? [单选题]哪个选项是下面代码的输出结果? d= {'a': 1, 'b': 2, 'b': '3'} print(d['b']) ...
- python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战
python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战 笔者遇到的问题是这样的, 在做机器学习模型的时候,有的时候会使用相关性分析的方法来进行特征的筛选,去除冗余特征,降 ...
- java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表
我正在编写此函数,该函数要使用整数打印给定列表的所有子列表.这些整数的总和应等于给定的数字n.还有一个以值0开头的帮助变量i.列表和每个子列表都是ArrayList.因此,该方法现在看起来像这样: p ...
- C#泛型列表List实现二维数组的功能(令附C#泛型列表List基本用法总结)
在决定使用 List<T> 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List<T> 类在大多数情况下执行得更好并且是类型安全的. 如果对 List< ...
- animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表
animate方法 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- 树型列表结构宽度调整_如何用Axure画出Web产品的列表组件:基础画法
Web产品的列表组件在画原型的时候比较常见,所以PM有必要深入了解它的各种交互效果和对应的原型画法. 除了通过表格来画出简单列表之外,我们还可以通过中继器来画出列表,相应的原型效果请查看https:/ ...
- python删除列表元素_追求简单C++之删除STL列表的元素
本文介绍了STL列表中的删除方面. 1.使用list :: erase():此函数的目的是从列表中删除元素.使用此功能可以删除范围内的单个或多个连续元素.该函数有两个参数,开始迭代器和结束迭代器. 2 ...
- redis源码剖析(五)—— 字符串,列表,哈希,集合,有序集合
文章目录 对象 REDIS_STRING (字符串) REDIS_LIST 列表 REDIS_SET (集合) REDIS_ZSET (有序集合) REDIS_HASH (hash表) int ref ...
- python中集合的元素可以是任意数据类型_Python数据类型之列表
列表 列表是由一系列按特定循序排列的元素组成(即有序集合).使用中括号[]来表示,并用逗号来分隔其中的元素. 列表的元素可以是任意类型. list 列表(序列)中的每个元素都分配一个数字索引,从 0 ...
- python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...
本问题已经有最佳答案,请猛点这里访问. 这是我在学习Python编程时遇到的最常见的问题.问题是,当我尝试使用"range()"函数迭代列表时,检查列表中的给定项是否满足给定条件, ...
最新文章
- Android官方模拟器root,在Android模拟器上如何获得root权限?
- 专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发
- python while 循环 if elif else 判断
- Python中的 optparse模块
- element-ui Notification重叠问题,原因及解决办法
- 开源监控Prometheus二进制安装
- 如何用java实现使用电子邮件控制你的电脑
- 【 Codeforces Round #547 (Div. 3) G】Privatization of Roads in Treeland【树上贪心问题】
- sendkeys安装包_利用Windows命令行解压zip压缩文件(不借助第三方软件)
- mysql8.0怎么设置中文版_MySQL 8.0 版本修改字符编码
- 在虚拟机、Mac 电脑和旧电脑上绕过 TPM 安装 Windows 11 的方法总结(提供通用无 TPM 检测镜像下载)
- 日常工作常用的几款小工具
- Python爬虫之知乎回答
- 字母c代表什么数字_字母C
- 这些你必须知道的 Linux 技能
- “史上最贵”卡塔尔世界杯,有哪些炫酷的“黑科技”?
- office2016 使用KMS破解无法连接服务器
- 字节测试实习生面试回顾
- 突发:陆奇出任拼多多技术顾问委员会负责人
- Excel Charting Utility赠品
热门文章
- Mac 开机没声音了?只需 2 招关闭/恢复Mac开机音效「咚」
- iOS开发UIAlertController之UIAlertAction加图片(UIAlertController按钮加图片)
- Sketch 76 for mac(矢量绘图设计软件)
- 如何在Mac 上的“终端”中限制回滚行数?
- 二分类问题的评分值与损失函数
- 服务网与Kubernetes上的Istio分5步
- 什么是Code Review(转)
- MaxCompute 2.0 生态开放之路及最新发展
- windows服务器性能监控工具、方法及关键指标
- 庞果网一道题(字符博弈)的一点想法