我正在尝试为以下无序映射编写排序算法。我看到this问题,我正在尝试将其用于无序地图,但它无效!
注意 - 我不允许使用任何STL排序功能。
void quickSort(unordered_map<string, int> map, unordered_map<string, int>::iterator left,unordered_map<string, int>::iterator right) {
unordered_map<string, int>::iterator i=left;
unordered_map<string, int>::iterator j=right;
unordered_map<string, int>::iterator pivot = std::advance(map.begin(), map.size() / 2);
unordered_map<string, int> tmp;
}
int main(){
unordered_map<string, int> map;
map["blah"] = 2;
map["the"] = 5;
quickSort(map,map.begin(),map.end());
}
答案 0 :(得分:2)
无序地图没有顺序(顾名思义),因此在无序地图中找到中位数是没有意义的。如果你需要找到中位数 - 使用一个辅助数组并在其中执行一些nth_element算法的实现。这一步将具有线性复杂性。
答案 1 :(得分:2)
正如评论中所述,您无法对unordered_map
进行排序,因为其value_type
为std::pair<const Key, T>
{注释const
!)unordered_map<Key,T>
。这意味着您无法在地图中交换元素,因此无法对其进行排序。您需要将数据复制到另一个数据结构中,如矢量,然后您可以使用一些&#34;本土生长的&#34;版本为std::nth_element
:
std::vector<std::pair<Key,T>> med {map.begin(), map.end()};
my_nth_element(med.begin(), med.end(), med.begin() + med.size() / 2);
auto median = med[med.size()/2];
您应该平均实现具有线性复杂度的nth_element
。 (如果输入值的数量恰好是偶数,则需要使用两个中间值的平均值。)