Fast sort algorithms for arrays with mostly duplicated elements?

后端 未结 5 912
野的像风
野的像风 2021-01-11 17:03

What are efficient ways to sort arrays that have mostly a small set of duplicated elements? That is, a list like:

{ 10, 10, 55, 10, 999, 8851243, 10, 55, 55, 55, 10

5条回答
  •  [愿得一人]
    2021-01-11 17:18

    Implementation in C++ based on algo as suggested by @Antti Huima

    • Count frequencies and store in hashtable.
    • sort elements in hashtable.
    • overwrite input array with sorted elements depending on frequencies.
    #include 
    #include 
    // Modifies input array to a sorted array
    // Complexity: O(n+(k*log(k))) where 'k' = number of unique elements input array
    template 
    void SortArrayWithDuplicates(std::vector& in_seq) {
      std::unordered_map key_counts_map;
      // Count freqs O(n)
      for (const auto& itr: in_seq)
          key_counts_map[itr] += 1;
    
      // Sort elements by inserting into a map O(k*log(k))
      std::map key_counts_sorted_map;
      for (auto const& itr: key_counts_map)
          key_counts_sorted_map.insert(std::make_pair(itr.first, itr.second));
    
      auto AlwaysTrue = [](Datatype i)->bool{return true;};
      auto seq_itr = std::begin(in_seq);
      // Update input sequence with new sorted values
      for (auto const& itr: key_counts_sorted_map) {
          std::replace_if(seq_itr, seq_itr+itr.second, AlwaysTrue, itr.first);
          seq_itr += itr.second;
      }
    }
    

提交回复
热议问题