Не работает сортировка подсчётом в С++

99
17 сентября 2021, 05:40

Задача: отсортировать массив пар "ключ-значение" по ключу сортировкой подсчёта. Проблема: валится на некоторых тестах, таких, как 45894 5439345 32 979 194639 3478983 385025 3093494 32 35930

Или вот таких 5 34 98 23 1 55 234 78

Стандартный вектор использовать нельзя. Да и вообще контейнеры из STL. Код, который надо отладить:

#include <iostream>
#include <iomanip>
using namespace std;
typedef unsigned long long long_t;
class Index{
private:

long_t key, elem;
public:
    Index(int k, long_t e) : key(k), elem(e) {} //ключ(индекс), элемент(значение)
    Index() : key(), elem() {}
    friend Index* CountingSort(Index* obj, long_t max, size_t n); //объект(пара), максимальный элемент, количество элементов
    void Show(){
      cout << std::setw(6) << std::setfill('0') << key << "  " << elem << endl;
    }
    Index Set(long_t k, long_t e){//функция, помогающая нам связать пары
      elem = e;
      key  = k;
      return *this;
    }
  };
Index* CountingSort(Index* obj, long_t max, size_t n){//сортировка подсчётом
  long_t *c = new long_t[max];
  for (size_t i = 0; i < max ; ++i){
    c[i] = 0;
  }
  for (size_t i = 0; i < n; ++i){
    ++c[obj[i].key];
    c[obj[i].key] = obj[i].elem;
  }
  for (size_t j = 0, i = 0; j < max; ++j){
    if (c[j] != 0){
      obj[i].elem = c[j];
      obj[i].key  = j;
      c[j]--;
      ++i;
    }
  }
  delete[] c;
  return obj;
}
int main(){
  long_t e, k, max = 0;
  int n, i = 0;
  Index* a = new Index[10000];
while (cin >> k >> e){
  if(e > max) max = e;
  a[i].Set(k, e);
  i++;
}
n = i;
CountingSort(a, max, n);
for (int i = 0; i < n; i++){
  a[i].Show();
}
std::cin.clear();
std::cin.sync();
std::cin.get();
return 0;
}
Answer 1

Кхм... if(e > max) max = e надо по k сравнивать. Вам же по ключу потом вносить. Ну и да, new long_t[max+1] не забудьте.

А в целом по коду всё очень странно. Куча ненужных операций, ++c[obj[i].key] c[j]--

Непонятные именования (использовать метод Set как конструктор по сути), да ещё который и возвращает свою копию...

Прыжки типов, конечно не страшно, но int -> size_t преобразования, long_t использование немного не там где надо) (max явно не должен им быть).

Но это уже сами поправите.

P.S. 70 строк где хватает 20 это тоже не очень хорошо.

READ ALSO
Запуск Start Experimental Instance of Visual Studio 2019 с помощью DTE

Запуск Start Experimental Instance of Visual Studio 2019 с помощью DTE

Как запустить Start Experimental Instance of Visual Studio 2019 с помощью DTE? Достучаться до VS 2019 получается так:

183
Как сделать быструю галерею в OnGUI() Unity?

Как сделать быструю галерею в OnGUI() Unity?

У меня есть галерея объектов в Unity, :

203
Serialize JSON ListView

Serialize JSON ListView

Подскажите, как исправить ошибку, всё никак не получается

261