将k个有序链表合并成一个有序链表

将k个有序链表合并成一个有序链表

这里以从小到大排序为例,
时间复杂度为O(nlgk)。
特点:利用最小堆来完成k路归并
思路:取每个列表中的第一个元素,并将其放在最小堆中。与每个元素一起,必须跟踪从哪个列表中获取它。当合并时,从堆中取最小的元素,然后从它的来源列表中插入另一个元素(除非列表为空,为空时最小堆减少)。继续执行,直到清空堆。

辅助类:1⃣️ KeyValuePair
跟踪是哪个链表

class KeyValuePair {
public:int key;int value;
public:KeyValuePair();KeyValuePair(int key,int value);
};
KeyValuePair::KeyValuePair(){}
KeyValuePair::KeyValuePair(int key,int value):key(key),value(value){};

2⃣️MinimumHeapTemplate
模版类最小堆的构建
里面所含的头文件代码:堆排序

#include "heap_sort.h"
#include <iostream>
using namespace std;
template <typename T>
void min_heapify(vector<T>& array,int heap_size,int parent_index)
{int smallest = parent_index;int l = left(parent_index);int r = right(parent_index);if(l<heap_size && array[l].key<array[smallest].key)smallest = l;if(r<heap_size && array[r].key<array[smallest].key)smallest = r;if(parent_index != smallest){T temp = array[smallest];array[smallest] = array[parent_index];array[parent_index] = temp;min_heapify(array,heap_size,smallest);}
}template <typename T>
void build_min_heap(vector<T>& array,int length)
{for(int i= length/2;i>=0;i--){min_heapify(array,length,i);}
}

最终合并实现

#include "MinimumHeapTemplate.h"
#include "KeyValuePair.h"
#include <vector>
#include <stdexcept>using namespace std;
void merge_ordered_arrays(int **array,int row,int column,int *out_array);void merge_ordered_arrays(int **array,int row,int column,int *out_array){vector<KeyValuePair> heap_sort_array(row);int *count_array = new int [row];int heap_size = row;for (int i = 0; i < row; ++i) {count_array[i] = 1;}for (int i = 0; i < row; ++i) {heap_sort_array[i].key = array[i][0];heap_sort_array[i].value = i;}build_min_heap(heap_sort_array,row);int index = 0;while (heap_size>0){KeyValuePair top = heap_sort_array[0];out_array[index] = top.key;index++;if(count_array[top.value]<column){heap_sort_array[0].key = array[top.value][count_array[top.value]];heap_sort_array[0].value = top.value;count_array[top.value]++;min_heapify(heap_sort_array,heap_size,0);}else{heap_size--;heap_sort_array[0] = heap_sort_array[heap_size];min_heapify(heap_sort_array,heap_size,0);}}delete [] count_array;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Student.Achieve] 学生教务管理系统开源

&#xff08;源自&#xff1a;https://neters.club&#xff09;一觉醒来Github改版了&#xff0c;我个人还是挺喜欢的????。还有两个月就是老张做开源两周年了&#xff0c;时间真快&#xff0c;也慢慢的贡献了很多的开源作品&#xff0c;上边的是主要的七个作品&#xff0c…

d叉堆实现优先队列

d叉堆实现优先队列 时间复杂度 dlog&#xff08;d,n) #include <stdexcept> #include <iostream> class DForkHeapPriorityQueue { private:int capacity;int *array;int d;int heap_size; public:DForkHeapPriorityQueue(int capacity,int d);DForkHeapPriority…

.NET Core HttpClient源码探究

前言在之前的文章我们介绍过HttpClient相关的服务发现&#xff0c;确实HttpClient是目前.NET Core进行Http网络编程的的主要手段。在之前的介绍中也看到了&#xff0c;我们使用了一个很重要的抽象HttpMessageHandler&#xff0c;接下来我们就探究一下HttpClient源码&#xff0c…

Young氏矩阵

Young氏矩阵 利用堆思想实现Young氏矩阵 #include <iostream> class YoungTableau {private:int *array;int row;int column;int heap_size; public:YoungTableau

Java 多线程:线程优先级

1 优先级取值范围 Java 线程优先级使用 1 ~ 10 的整数表示&#xff1a; 最低优先级 1&#xff1a;Thread.MIN_PRIORITY 最高优先级 10&#xff1a;Thread.MAX_PRIORITY 普通优先级 5&#xff1a;Thread.NORM_PRIORITY 2 获取线程优先级 public static void main(String[]…

《Unit Testing》1.1 -1.2 单元测试的目的

本系列是《Unit Testing》 一书的读书笔记 精华提取。书中的例子 C# 语言编写&#xff0c;但概念是通用的&#xff0c;只要懂得面向对象编程就可以。 单元测试当前的状态目前&#xff0c;在&#xff08;美国的&#xff09;大部分公司里&#xff0c;单元测试都是强制性的。生产…

算法-排序-快速排序(包含多种快速排序)

快速排序 特点&#xff1a;原址排序&#xff0c;最坏的时间复杂度O&#xff08;n^2) 平均时间复杂度O&#xff08;nlgn&#xff09; 比归并排序系数常数项小 不稳定 底部有最坏时间复杂度为Ω(nlgn)的快速排序地址 void quick_sort(int *array,int start,int end); int parti…

Java Exception

Exception 异常捕获 将代码块选中->ctrlaltt->选中try-catch 01: public class Exception01 {public static void main(String[] args) {int n1 10;int n2 0;try {int res n1/n2;} catch (Exception e) { // e.printStackTrace();System.out.println(e.…

《Unit Testing》1.3 使用覆盖率指标来度量测试套件的好坏

使用覆盖率来度量测试套件&#xff08;Test Suite&#xff09;的质量有两种比较流行的测试覆盖率的度量方法&#xff1a;代码覆盖率分支覆盖率覆盖率度量会显示一个测试套件&#xff08;Test Suite&#xff09;会执行多少代码&#xff0c;范围从 0 至 100%。除了上述两种方法之…

对区间的模糊排序

对区间的模糊排序 算法导论第三版第二部分7-6题 Interval find_intersection(vector<Interval> &array,int start,int end) {int random random_include_left_right(start,end);Interval key array[end];array[end] array[random];array[random] key;key arra…

Linux创始人:v5.8是有史以来最大的发行版之一

导语Linux v5.8已经修改了所有文件的20&#xff05;&#xff0c;是迄今为止变化最大的一次发行版。正文Linux创始人Linus Torvalds表示&#xff1a;Linux内核5.8版是“我们有史以来最大的发行版之一”。如果一切顺利&#xff0c;Linux v5.8稳定版应该在2020年8月的某个时候出现…

算法-排序-计数排序(包含对非负数和整数的排序)

计数排序 时间复杂度O&#xff08;n&#xff09; 特点&#xff1a;稳定 限制&#xff1a;对0到maximum中的数进行排序 maximum要求&#xff0c;比数组中最大值大或者相等 有拓展版本的计数排序&#xff08;在文章基数排序内&#xff09; 基数排序链接 void counting_sort(int…

[高等数学]这你不背?

求导及求微分的基本公式: 泰勒中值定理: 麦克劳林公式: 不定积分公式: 凑微分: 第二类换元积分法常用的三种情况: 求高阶导数的几个公式: 二阶常系数非齐次线性微分方程的特解: 排列组合公式: C的计算&#xff1a; 下标的数字乘以上标的数字的个数,且每个数字都要-1.再除以上标…

怎么开会才不浪费时间?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「148」篇原创敬上大家好&#xff0c;我是Z哥&#xff0c;先祝大家端午节日快乐。节日期间就发篇比较短的文章吧。人在职场混&#xff0c;开会应该是本职工作之外花…

在O(1)的时间内计算n个整数落在区间[a,b]的个数(预处理时间为O(n+k))

在O&#xff08;1&#xff09;的时间内计算n个整数落在区间[a,b]的个数 预处理时间为O&#xff08;nk) 算法导论第三版8.2-4题 int find_inverter_count(int *array,int length,int maximum,int inverter_left,int inverter_right) {if(inverter_left<0 || inverter_right…

汇编语言中常见的标志位: CF, PF, AF, ZF, SF,TF,IF,DF, OF

一、运算结构标志位 1.CF(进位标志位)&#xff1a;主要用来反映运算是否产生进位或借位&#xff0c;产生进位或借位则CF1&#xff0c;否则CF0。 2.PF(奇偶标志位)&#xff1a;用于反映运算结果中“1”的个数的奇偶性&#xff0c;如果“1”的个数为偶数&#xff0c;则PF1&…

算法-排序-基数排序(对任意整数排序)

基数排序 时间复杂度&#xff1a;Θ(d(nk)) d&#xff1a;元素的位数&#xff0c;k元素中每位数的取值区间大小 非原址排序 1⃣️特点该排序只能每次为基数为1位数进行排序 void radix_sort(int *array,int length,int digits){vector<KeyValuePair> temp_array(length…

.NET 5.0预览版6发布:支持Windows ARM64设备

2020年6月25日&#xff0c;微软dotnet团队在博客宣布了第六个 .NET 5.0 的预览版&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-net-5-0-preview-6/&#xff0c;在改进性能的同时增加了一些新的功能。ASP.NET Core和 EF Core也将于今日发布了。注意&#xff1…

利用真值表法求取主析取范式以及主合取范式的实现(C++)

代码如下: #include <iostream> #include <stack> #include <string> #include <vector> using namespace std; const int N 300; stack<char> s; stack<char> v; int seq; bool vis[N]; bool flag[N]; void dfs(int n); vector<int&…