如何从数组中的起始索引到结束索引获取排序元素?

时间:2014-01-11 16:33:44

标签: c++ algorithm sorting data-structures

给定一个t整数数组,我们需要回答x个查询。每个查询描述一个起始索引和一个结束索引,我们需要在子数组中打印已排序的元素。 例如 -
阵列= {16,9,10,19,2}
对于查询1 3,答案是
9 10 16
对于查询2 5,答案是
2 9 10 19
请提出最佳解决方案?是否涉及任何高级数据结构? 元素的数量可以达到10 ^ 5.

3 个答案:

答案 0 :(得分:4)

用它的位置标记每个元素:

16 1, 9 2, 10 3, 19 4, 2 5

排序:

2 5, 9 2, 10 3, 16 1, 19 4

对于每个查询遍历结果并返回范围内的元素。

预处理后,每个查询都需要O(N)工作。

答案 1 :(得分:2)

  

是否涉及任何高级数据结构?

不,完全没有。首先获取这些索引给出的范围,然后对结果范围进行排序。然后你打印它。看起来很简单!

事实上,它很简单,我将向您展示一个例子:

#include <algorithm>
#include <vector>
#include <iostream>
#include <cassert>

template <typename T, size_t N>
size_t len(T (&)[N])
{
   return N;
}


int main()
{
    int array[] = {16,9,10,19,2};

    const int START = 1;  // user input ( 1-based index,)
    const int END   = 3;  // user input (inclusive range)

    assert((START-1) >= 0 && (START <= len(array)));
    assert((END-1)   >= 0 && (END <= len(array)));

    // These two lines do the work.
    // Everything else is just exposition.
    // 
    // First construct a vector from the requested subrange,
    // then sort that resulting vector.
    // 
    std::vector<int> v(array+(START-1), array+END);
    std::sort(std::begin(v), std::end(v));

    // Output the results to console for demo.
    // Uses C++ ranged-for syntax; replace with more
    // verbose equivalent if required, or do something
    // else with `v`.
    // 
    for (auto elm : v) {
       std::cout << elm << ' ';
    }
}

// Output: 9 10 6

Live demo

您可以通过将子范围复制到std::set而不是std::vector来使代码更加简洁(并且可能更高效),因此在插入期间进行排序而不是后 - 事实。我很难想象任何一件事都会像O(n^2)一样,与你的主张相反。

您是否可以进行充分的预处理以在各个查询之间共享信息并进一步降低复杂性?我不知道。我不这么认为。

答案 2 :(得分:0)

如果我理解你的问题:排序。
您可以使用任何所需的排序算法,Wikipedia列出一些。

根据您选择的算法,您可能需要额外的内存/数据结构。

如果稍后要进行排序,请复制数组并对副本进行排序。比每次查询一遍又一遍地排序更有意义。