Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在数组中从起始索引到结束索引获取排序元素?_C++_Algorithm_Sorting_Data Structures - Fatal编程技术网

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

C++ 如何在数组中从起始索引到结束索引获取排序元素?,c++,algorithm,sorting,data-structures,C++,Algorithm,Sorting,Data Structures,给定一个t整数数组,我们需要回答x个查询。每个查询描述一个起始索引和一个结束索引,我们需要打印子数组中已排序的元素。 比如说- 数组={16,9,10,19,2} 对于问题13,答案是 9 10 16 对于问题25,答案是 2 9 10 19 请提出最佳解决方案?是否涉及任何高级数据结构? 元素的数量最多可以达到10^5。如果我理解您的问题:对其进行排序。 您可以使用任何您想要的排序算法,列出了一些 根据您选择的算法,您可能需要额外的内存/数据结构 如果稍后需要排序,请复制数组并对副本进行排序。

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

如果我理解您的问题:对其进行排序。 您可以使用任何您想要的排序算法,列出了一些

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

如果稍后需要排序,请复制数组并对副本进行排序。这比对每个查询反复排序更有意义

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

不,一点也不。首先获取这些索引给定的范围,然后对结果范围进行排序。然后你把它打印出来。看起来很简单

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

#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
通过将子范围复制到std::set而不是std::vector中,您可以使代码更加简洁,并且可能更加高效,因此排序是在插入过程中进行的,而不是在插入之后进行的。我认为两者都不会像^2那么高,这与你的说法相反


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

用位置标记每个元素:

16 1, 9 2, 10 3, 19 4, 2 5
排序:

2 5, 9 2, 10 3, 16 1, 19 4
对于每个查询,遍历结果并返回范围内的元素


预处理后,每个查询都会开始工作。

所有需要的算法都在标准库中实现,即std::vector和std::sort。你可以很容易地找到两者的参考资料。这些是允许使用的吗?如果是这样的话,那就很简单了。这里是排序数组,2,9,10,16,19。问题一:9、10、16有意义。查询二:是否允许您对数组进行排序?@user3092832请在问题中包括您的解决方案想法和附加要求。此外,查询的数量是否为n级、更低或更高?查询的长度是多少?@user3092832:这是问题中需要考虑的要求,我不是说20分钟后,当我们都已经花时间为你写答案时。最糟糕的时间复杂度是^2*个查询。我需要比这更好这里最糟糕的时间复杂度是^2*个查询。我需要比这更好here@user3092832std::sort没有最坏情况下的时间复杂度——它是。“你在哪里读到的?”VladfromMoscow:在英国,我们不认为它是先进的。如果向量在莫斯科是先进的,那么很好。@VladFrommoskow:请不要构造strawman参数。一些标准容器就是我所说的高级容器。我只是说向量不是一,当大小改变时,它看起来也像一个数组。它本质上是存储元素最简单的方法;在连续的内存块中。顺便说一句,数组也有自己的方法。OP拒绝了我,说排序必须在之后进行,这当然不是真的。Thanx很多。我一定会尝试这种方法