解题思路:

排序方法:多路归并排序

每次将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路归并排序)...相关推荐

  1. 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']) ...

  2. python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战

    python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战 笔者遇到的问题是这样的, 在做机器学习模型的时候,有的时候会使用相关性分析的方法来进行特征的筛选,去除冗余特征,降 ...

  3. java用递归的方式写n_java-使用递归将其元素加起来为n的子集的列表

    我正在编写此函数,该函数要使用整数打印给定列表的所有子列表.这些整数的总和应等于给定的数字n.还有一个以值0开头的帮助变量i.列表和每个子列表都是ArrayList.因此,该方法现在看起来像这样: p ...

  4. C#泛型列表List实现二维数组的功能(令附C#泛型列表List基本用法总结)

    在决定使用 List<T> 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List<T> 类在大多数情况下执行得更好并且是类型安全的. 如果对 List< ...

  5. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表

    animate方法 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  6. 树型列表结构宽度调整_如何用Axure画出Web产品的列表组件:基础画法

    Web产品的列表组件在画原型的时候比较常见,所以PM有必要深入了解它的各种交互效果和对应的原型画法. 除了通过表格来画出简单列表之外,我们还可以通过中继器来画出列表,相应的原型效果请查看https:/ ...

  7. python删除列表元素_追求简单C++之删除STL列表的元素

    本文介绍了STL列表中的删除方面. 1.使用list :: erase():此函数的目的是从列表中删除元素.使用此功能可以删除范围内的单个或多个连续元素.该函数有两个参数,开始迭代器和结束迭代器. 2 ...

  8. redis源码剖析(五)—— 字符串,列表,哈希,集合,有序集合

    文章目录 对象 REDIS_STRING (字符串) REDIS_LIST 列表 REDIS_SET (集合) REDIS_ZSET (有序集合) REDIS_HASH (hash表) int ref ...

  9. python中集合的元素可以是任意数据类型_Python数据类型之列表

    列表 列表是由一系列按特定循序排列的元素组成(即有序集合).使用中括号[]来表示,并用逗号来分隔其中的元素. 列表的元素可以是任意类型. list 列表(序列)中的每个元素都分配一个数字索引,从 0 ...

  10. python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...

    本问题已经有最佳答案,请猛点这里访问. 这是我在学习Python编程时遇到的最常见的问题.问题是,当我尝试使用"range()"函数迭代列表时,检查列表中的给定项是否满足给定条件, ...

最新文章

  1. Android官方模拟器root,在Android模拟器上如何获得root权限?
  2. 专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发
  3. python while 循环 if elif else 判断
  4. Python中的 optparse模块
  5. element-ui Notification重叠问题,原因及解决办法
  6. 开源监控Prometheus二进制安装
  7. 如何用java实现使用电子邮件控制你的电脑
  8. 【 Codeforces Round #547 (Div. 3) G】Privatization of Roads in Treeland【树上贪心问题】
  9. sendkeys安装包_利用Windows命令行解压zip压缩文件(不借助第三方软件)
  10. mysql8.0怎么设置中文版_MySQL 8.0 版本修改字符编码
  11. 在虚拟机、Mac 电脑和旧电脑上绕过 TPM 安装 Windows 11 的方法总结(提供通用无 TPM 检测镜像下载)
  12. 日常工作常用的几款小工具
  13. Python爬虫之知乎回答
  14. 字母c代表什么数字_字母C
  15. 这些你必须知道的 Linux 技能
  16. “史上最贵”卡塔尔世界杯,有哪些炫酷的“黑科技”?
  17. office2016 使用KMS破解无法连接服务器
  18. 字节测试实习生面试回顾
  19. 突发:陆奇出任拼多多技术顾问委员会负责人
  20. Excel Charting Utility赠品

热门文章

  1. Mac 开机没声音了?只需 2 招关闭/恢复Mac开机音效「咚」
  2. iOS开发UIAlertController之UIAlertAction加图片(UIAlertController按钮加图片)
  3. Sketch 76 for mac(矢量绘图设计软件)
  4. 如何在Mac 上的“终端”中限制回滚行数?
  5. 二分类问题的评分值与损失函数
  6. 服务网与Kubernetes上的Istio分5步
  7. 什么是Code Review(转)
  8. MaxCompute 2.0 生态开放之路及最新发展
  9. windows服务器性能监控工具、方法及关键指标
  10. 庞果网一道题(字符博弈)的一点想法