【问题标题】:How to sort an array(in ascending order) based on the ranks of each element which is in the another array?如何根据另一个数组中每个元素的排名对数组进行排序(按升序)?
【发布时间】:2021-10-03 02:19:17
【问题描述】:

让两个数组

arr = [1,5,6,3,10] 


rank = [100,0,1,100,2]

基于rank 数组(其中包含arr 中镜像元素的ranks),结果应该是

[5,6,10,1,3]

结果中的第一个元素是5

(arr中5的索引为arr[1],rank中0的索引为 rank[1]。这就是我们必须采取排名的方式。 0 是所有等级中最小的,因此首先打印 5 )

结果中的第二个元素是6

arr数组中6的索引在索引arr[2]处,其秩为 1,因为它位于索引 rank[2]。 1 是第二小的 所有等级,所以接下来打印 6) 这就是我们必须根据排名数组对数组进行排序的方式。

Here if two ranks are same then we have to compare the values in the array itself and print the smaller first
arr[0] = 1 and arr[3] = 3 Both having same ranks 100. So compare those elements and print the smallest value. That gives the

结果 5,6,10,1,3

【问题讨论】:

  • 你能改变rank 或创建额外的数据结构吗?如果您可以创建一个对数组,对其进行排序,然后提取所需的值,那就容易多了。
  • 是的,我们可以。你能用 C++ 解决这个问题吗? .我已经用 unordered_map 解决了这个问题,并且搞砸了一些逻辑。你能想出解决下面的测试用例吗?
  • 第二个测试用例:arr = [3,1,2,5] , rank = [1,1,2,2] => result = [1,3,2,5] .Hope你得到这个。 arr 元素 1 和 3 的秩为 1,因此将它们进行比较,并将 1 写入结果 [0],将 3 写入结果 [1]。最后 2 个元素类似
  • 嗯,unordered_map 的重点是它没有排序(排序)。你快到了,只需使用std::map
  • 也用过。第一个测试用例成功了,但第二个失败了。

标签: c++ arrays sorting comparison


【解决方案1】:

简短的回答是:std::sort

长答案取决于您如何存储值和排名,您是否可以复制它们,以及您是否还需要对排名进行排序。对于以下内容,我假设您不需要对排名进行排序,并且排序是在原始值容器上完成的。这不是最有效的实现,但它很简单,可以帮助您入门:

#include <vector>
#include <utility>
#include <algorithm>
#include <iostream>
#include <iterator>

template <typename Iter,typename RankIter>
void rank_sort(Iter begin,Iter end,RankIter rankbegin){
    std::vector<std::pair<typename std::iterator_traits<RankIter>::value_type,
                          typename std::iterator_traits<Iter>::value_type >> res;
    for (auto beg = begin; beg != end; ++beg,++rankbegin) res.emplace_back(*rankbegin,*beg); 
    std::sort(res.begin(),res.end());
    for (const auto& e : res){
        *begin = e.second;
        ++begin;
    }
}


int main() {
    std::vector<int> arr{1,5,6,3,10};
    std::vector<int> rank{100,0,1,100,2};
    rank_sort(arr.begin(),arr.end(),rank.begin());
    for (const auto& a : arr) { std::cout << a << " ";}
}

基本思想是创建一个std::vector&lt;std::pair&lt;int,int&gt;&gt;,然后简单地通过std::sort 对其进行排序。其余代码是关于将值和排名复制到该向量中,并在排序后将值复制出来。

如果可能,您应该首先将值和排名存储在std::vector&lt;std::pair&lt;int,int&gt;&gt; 中。然后对它们进行排序是微不足道的。或者,如评论中所述,您可以使用排序容器,例如 std::map

【讨论】:

  • 太棒了。谢谢你。我有一个小要求。你能在没有 STL 的情况下解决这个问题吗?这对我有很大帮助。
  • @DoubleH 我想您的意思是标准库(STL 是标准模板库,它是标准库许多部分的前身)。为什么?我想我可以为std::sort 写一个替代品,但我从来没有这样做过,老实说我不喜欢。你可以在网上搜索排序算法。
  • @DoubleH:标准库是 C++ 的一个组成部分。当然有可能,一些公司使用替代库。我相信 Electronic Arts 使用的是 EASTL。但是每个理智的程序员都会为这类事情使用库。
  • @prehistoricpenguin 我多年来一直以在学校学习的方式编写 C++,这是一个痛苦的世界。我花了很多力气才意识到如果一个人正确使用它会带来多大的乐趣。在没有标准库的情况下教授 C++ 弊大于利。
  • @prehistoricpenguin 那是我在公司安置过程中的一轮编码问题。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2015-06-08
  • 2016-02-01
相关资源
最近更新 更多