k路归并 O(nlogk)

作者: 你猪头啊 | 来源:发表于2019-03-21 13:06 被阅读34次

题目

假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素。设计和实现 一个有效的分治算法解决k-路合并操作问题,并分析时间复杂度。

算法思想

采用分治法归并排序,归并两个有序数组时间复杂度为O(n),将K个有序数组分治归并时间复杂度为O(logk),算法整体时间复杂度为O(nlogk),程序里用到了vector向量容器。

#include <iostream>
#include <vector>
using namespace std;
vector<int> mergeTowArrays(vector<int>A,vector<int>B)
{
    vector<int>temp;
    temp.resize(A.size() + B.size());
    int index = 0, j = 0, i = 0;
    while (i < A.size() && j < B.size())
    {
        if (A[i] < B[j])
            temp[index++] = A[i++];
        else
            temp[index++] = B[j++];
    }
        while (i < A.size())
            temp[index++] = A[i++];
        while (j < B.size())
            temp[index++] = B[j++];
        return temp;
}
vector<int> kMergeSort(vector<vector<int>>A, int start, int end)
{
    if (start >= end)
        return A[start];
    int mid = start + (end - start) / 2;
    vector<int>Left = kMergeSort(A, start, mid);
    vector<int>Right = kMergeSort(A, mid + 1, end);
    return mergeTowArrays(Left, Right);
}
vector<int> mergeSortArrays(vector <vector<int>>A)
{
    vector<int>temp;
    if (A.empty() || A.size() == 0 || A[0].size() == 0)
        return temp;
    temp = kMergeSort(A, 0, A.size() - 1);
    return temp;
}
int main(void)
{
    int k,n;
    cin >> k >> n;
    vector<vector<int>>A(k);
    for (int i = 0; i < k; i++)
    {
        A[i].resize(n);
    }
    for (int i = 0; i < A.size(); i++)
    {
        for (int j = 0; j < A[0].size(); j++)
            cin >> A[i][j];
    }
    vector<int>result;
    result = mergeSortArrays(A);
    for (int i = 0; i < result.size(); i++)
    {
        cout << result[i] << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}

相关文章

  • k路归并 O(nlogk)

    题目 假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素。...

  • 23、Merge k Sorted Lists

    难度:高 先来看一下两个有序链表如何归并时间 O(N) 空间 O(1) k个链表归并 复杂度时间 O(NlogK)...

  • 归并排序+基数排序

    归并排序 二路归并排序归并过程 O(n)整个归并排序需要⌈log2n⌉趟(k路归并需要⌈logkn⌉) 空间效率O...

  • 剑指Offer算法题解40-49

    40 最小的 K 个数马上解题 解题思路 大小为 K 的最小堆 复杂度:O(NlogK) + O(K) 特别适合处...

  • LeetCode-面试题40-最小的k个数

    排序 计数排序 使用容量为k的大顶堆 利用快排思想 时间复杂度 O(nlogk)

  • 剑指offer刷题结果

    重建二叉树 链表中倒数第k个结点 最小的k个数 O(n) , 基于快排思想,但是会修改原数组 O(nlogk),堆...

  • 算法实验二

    2016-10-09# 参考题目 败者树k路归并(可运行) 第一次成功发表博客!!O(∩_∩)O哈!

  • K 路合并算法

    用归并实现 k 路合并:

  • (C/C++)k个有序数组进行复杂度O(nlogk)的k-路归并

    假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素。设计和...

  • 找到无序数组的第K大数(堆实现)

    找到无序数组的第K大的数,实现思路有很多种,我们这次尝试下使用堆来实现。时间复杂度 O(nlogk) Heap的...

网友评论

    本文标题:k路归并 O(nlogk)

    本文链接:https://www.haomeiwen.com/subject/dgeqvqtx.html