Tak jak w temacie, problem mam z posortowaniem tego w taki sposób, żeby to rzeczywiście działało. Myślałem nad wykorzystaniem biblioteki <map>, ale chyba do końca jej nie ogarniam. Tak samo z biblioteką <vector>, aby ją wykorzystać podczas pobierania danych z pliku, a potem posortować.
Pokaż na przykładzie co chciałbyś osiągnąć
wejscie to powiedzmy: [5,3,2,5,5,2,1,4,6], a wyjscie to: [5,5,5,3,2,2,1,4,6]
Jaki to ma sens, w jaki sposób prawa lista powstała z lewej?
Sortuje tablicę na podstawie pierwszego wystąpienia liczby
Przepraszam, ze nie w C++ ale bym to jakos tak zrobil:
nvm, patrz nizej
Jakos to sobie przetlumacz na C++.
EDIT: albo prosciej
xs.sortBy(xs.indexOf(_))
EDIT2: Zlozonosc urosla do n^2, wiec polecam zrobic preprocessing z mapa tak jak jest to zaproponowane w poscie ponizej :)
@darek1222: Stwórz sobie mapę <int, int>, gdzie wartością będzie wystąpienie elementu, dla piatki, zero, trójki jeden, (z przykładu), itd., a kluczami będą liczby z tablicy; następnie uzyj tej mapy w funkcji porównującej elementy, którą przekaż do funkcji sortującej. Złożóność równa złożoności sortowania.
Prosty pomysł, możliwe, że niekoniecznie najwydajniejszy.
// dla tablicy typu T nazwanej array
std::map<T, size_t> first_seen;
size_t idx{};
for(auto const& element : array) {
first_seen.insert({element, idx++});
}
std::sort(std::begin(array), std::end(array), [&](auto const& l, auto const& r) {
return first_seen[l] < first_seen[r];
});
Pisane z głowy, może zawierać błędy
To jak juz mamy rozwiazanie to jeszcze powiedz, tak z ciekawosci, jaki problem w ten sposob rozwiazujesz? Czy to tylko takie cwiczenie?
Dzięki wielkie za odpowiedz, spróbuje coś z tym zrobić :)
PS Powiedzmy, że ćwiczenie
Powiedzmy, że ćwiczenie
Zrób to w O(N).
Mózg napisał(a):
Powiedzmy, że ćwiczenie
Zrób to w O(N).
MarekR22 napisał(a):
Tego nie da się zrobić lepiej niż O(n log n) chyba, że masz dodatkową wiedzę na temat zakresu liczb do posortowania, żeby móc zastosować radix sort lub coś w ten deseń
@MarekR22 jaka jest złożoność poniższego algorytmu?
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main()
{
vector<int> src{5,3,2,5,5,2,1,4,6};
unordered_map<int,size_t> positions;
unordered_map<size_t,int> values;
unordered_map<size_t,unsigned> counts;
unordered_map<size_t,size_t> orders;
for(size_t i=0,k=0;i<src.size();++i)
{
int value=src[i];
positions.insert(make_pair(value,i));
size_t position=positions[value];
++counts[position];
if(i==position)
{
values[i]=value;
orders[k++]=i;
}
}
for(size_t k=0;k<orders.size();++k)
{
size_t position=orders[k];
int value=values[position];
unsigned count=counts[position];
while(count--) cout<<value<<' ';
}
return 0;
}
- Drobna zmiana, wkleiła mi się poprzednia wersja.