Ordina la lista e cambia gli stessi valori quasi allo stesso modo

1

Ho una lista di doppi che devono essere ordinati e cambiati in modo che non ci siano due numeri uguali (differenza inferiore a 0.05) e ho bisogno di farlo velocemente. Non mi interessa preservare l'ordine per valori uguali.

Quello che sto facendo adesso è:

List<double> values;

bool sortfunction(double a, double b)
{
   return a < b;
}


.....
qSort(values.start, values.end, sortfunction);

for(int i = 0; i < values.count() - 1; i++)
{
   if(values[i] == values[i+1])
   {
      values[i+1] += 0.1;
   }
}

Ma il problema è con elenchi come { 0. ,0. ,0. ,5. ,6.3 } . Il risultato è { 0. ,0.1 ,0. ,5. ,6.3 } . Riesci a pensare a qualcosa che non richiede passaggi multipli di ordinamento?

    
posta mishan 22.10.2014 - 12:29
fonte

1 risposta

2

Chiaramente questo è solo uno schizzo:

#include <algorithm>
#include <iostream>
#include <vector>

std::vector<double> values = {0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.4, 5.0, 6.3, 6.3};

int main()
{
  std::sort(values.begin(), values.end());

  for (int i(0), sup(values.size()); i < sup; ++i)
    for (int j(i + 1); j < sup && std::abs(values[i] - values[j]) < 0.05; ++j)
      values[j] += 0.1;

  for (auto v : values)
    std::cout << v << '\n';
}

Con piccoli aggiustamenti funzionerà anche per gli elenchi:

std::list<double> values = { ... };

values.sort();

for (auto a(values.begin()), end(values.end()); a != end; ++a)
  for (auto b(std::next(a)); b != end && std::abs(*a - *b) < 0.05; ++b)
    *b += 0.1;
    
risposta data 22.10.2014 - 13:17
fonte

Leggi altre domande sui tag