Skocz do zawartości




Zdjęcie

[C++] Sortowanie


  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

Katalogi.pl

Katalogi.pl
  • Bywalec

#1 radek_1986

radek_1986

    1

  • Members
  • PipPipPip
  • 200 postów

Napisano 28 sierpień 2006 - 17:15

Witam!!
Mam dablice stringów [dużą :)] i chciałbym użyć systemowego qsorta...albo coś innego ale mi niewychodzi na stringach...A sortowanie bąbelkowe wielkiej tablicy to troszke ;) dlugo by trwalo...;]. Więc kto wie niech pocjwali sie to wiedzą w jaki sposób używa się qsorta w C, znalazłem takie coś:

void qsort ( void *tablica, size_t n, size_t rozmiar, int (*cmp) (const void *, const void * ) )

Ale sorry ale niewiem co gdzie wpisać ;]

#2 __max

__max

    1

  • Members
  • PipPipPip
  • 97 postów

Napisano 28 sierpień 2006 - 18:48

Pierwszy parametr - wskaźnik do tablicy
Drugi parametr - ilość elementów tablicy
Trzeci parametr - rozmiar pojedynczego elementu (w tym wypadku sizeof(char), czyli 1)
Czwarty parametr - wskaźnik do funkcji wg której będą porównywane ze sobą elementy tablicy. Funkcja ta ma zwracać wartość ujemną jeśli pierwszy jej argument jest mniejszy od drugiego, zero jeśli argumenty są sobie równe, a wartość dodatnią jeśli drugi argument jest mniejszy od pierwszego.
http://www.cppreference.com/stdother/qsort.html

qsort jest funkcją wywodzącą się z biblioteki C. Funkcja sort z biblioteki C++ (nagłówek ) jest wydajniejsza i wygodniejsza. Domyślnie porównuje elementy zbiornika w oparciu o operator < dzięki czemu dla typów, które obsługują ten operator nie trzeba już definiować żadnej zewnętrznej funkcji porównującej (nie wspominając o braku rzutowania na typ void i z powrotem, co jest konieczne w przypadku qsorta, a co ma negatywny wpływ na wydajność).
http://www.cppreference.com/cppalgorithm/sort.html

Porównanie obu metod sortowania:
http://theory.stanford.edu/~amitp/rants/c++-vs-c/

Pozdrawiam

Zmieniony przez - __max w dniu 2006-08-28 20:02:10

#3 radek_1986

radek_1986

    1

  • Members
  • PipPipPip
  • 200 postów

Napisano 28 sierpień 2006 - 19:06

Czy takie cos będzie dobre ??

qsort( tablica, ROZMIAR, sizeof(string), a tu nie wiem );

chyba ze w tym trzecim parametrze ma być sizeof(char) ??
tablica w programie ma deklaracje: string tabica[ROZMIAR];

A może w ostatnim parametrze mam wpisać funkcje porównującą strcmp??

Zmieniony przez - radek_1986 w dniu 2006-08-28 20:09:48

#4 __max

__max

    1

  • Members
  • PipPipPip
  • 97 postów

Napisano 28 sierpień 2006 - 19:12

Użyj funkcji sort - będzie dużo szybciej:

#include
...

sort(tablica, tablica + ROZMIAR);

qsort w przypadku klasy string może nie działać poprawnie, a jego użycie dla tej klasy może być raczej mało wygodne.
strcmp byłoby dobre ale dla char* - czyli łańcucha typowego dla C, a nie dla string - czyli łańcucha typowego dla C++. Najpierw musiałbyś przekonwertować string na char* (co skądinąd jest możliwe z pomocą funkcji string.c_str(), ale w tym wypadku nie jest to zbyt zgrabne rozwiązanie).

Zmieniony przez - __max w dniu 2006-08-28 20:22:23

#5 radek_1986

radek_1986

    1

  • Members
  • PipPipPip
  • 200 postów

Napisano 28 sierpień 2006 - 20:11

Ok, działa...thx..a czy moze jestes w stenie powiedzieć jak ten sort zachowa sie na polskich znakach ?? ;] plik w ktorym sortuje slowa jest zakodowany w takim formacie w ktorym kompilator jest w stanie rozpoznac polskie znaki...

A tak wychodząc poza temat, jak zmienić kolor tekstu ?? :] Używam Dev-c++ i funkcja TEXTCOLOR niedziała ;] Niewiem moze używam złej biblioteki, niewiem, bo np. w Borlandzie 3.1 działa ta funkcja :]

Zmieniony przez - radek_1986 w dniu 2006-08-28 21:17:43

#6 __max

__max

    1

  • Members
  • PipPipPip
  • 97 postów

Napisano 28 sierpień 2006 - 20:55

Zasadniczo to typ string służy tylko do obsługi znaków z tablicy ASCII (więc jest wielce prawdopodobne, a w zasadzie pewne, że przy sortowaniu polskie znaki nie będą traktowane w odpowiedni sposóB), do obsługi unicode (który powinnien bez problemów obsługiwać również polskie znaki diakrytyczne) służą typy:
wchar_t, wstring, wistream, wostream, wiostream, wifstream, wofstream, wfstream.

Zmieniony przez - __max w dniu 2006-08-28 22:00:04

#7 radek_1986

radek_1986

    1

  • Members
  • PipPipPip
  • 200 postów

Napisano 28 sierpień 2006 - 21:14

Probowalem zrobic na tych funkcjach..ale mi sie nieudawalo...no kompilator widzi polskie litery jako ujemnie znaki liczbowe..;] np ł jest -120 :)

Ale ten sort niedziała najgorzej...dzięki :]

____________________________________________________________________________________________________

Tak przy okazji może ktoś powie jak np przypisać pod trzy zmienne date, pod piewsza zmienna nr dnia miesiaca, druga zmienna nr miesiaca i pod trzecia rok.
Moze to troche dziwne...;] Ale mozna tak ?? :]

Zmieniony przez - radek_1986 w dniu 2006-08-28 23:52:19

#8 E_DRAVEN

E_DRAVEN

    1

  • Members
  • PipPipPip
  • 168 postów

Napisano 29 sierpień 2006 - 09:42

Ja bym na twoim miejscu listy użył. Lista ma metode sort(); Wogle mało kodu bedzie.

Pozdrawiam


#9 radek_1986

radek_1986

    1

  • Members
  • PipPipPip
  • 200 postów

Napisano 29 sierpień 2006 - 12:18

No, ale niebardzo rozumiem ;>
Ale dzieki :)

Zmieniony przez - radek_1986 w dniu 2006-08-29 13:19:07

#10 __max

__max

    1

  • Members
  • PipPipPip
  • 97 postów

Napisano 29 sierpień 2006 - 13:33

E_DRAVEN: przecież sort z nagłówka algorithm działa w takim samym czasie (O(nlog(n))) jak sort z nagłówka list, a samo wywołanie to jedna linia kodu.

radek: co do daty to: użyj funkcji localtime(time_t) (z nagłówka ), która zwraca wskaźnik na strukturę przechowującą takie informacje jak nr dnia, miesiąca, roku itd..
Tutaj masz wszystko ładnie opisane:
http://www.cplusplus.com/ref/ctime/localtime.html
http://www.cplusplus.com/ref/ctime/tm.html

Zmieniony przez - __max w dniu 2006-08-29 14:34:27

#11 E_DRAVEN

E_DRAVEN

    1

  • Members
  • PipPipPip
  • 168 postów

Napisano 29 sierpień 2006 - 14:12

taaaaaaaaaaa tylko ze jak ma bardzo duzo stringów to lepiej pojemnik zrobić a nie tablice zwykłą



Similar Topics Collapse

  Temat Forum Autor Podsumowanie Ostatni post


Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych


Inne serwisy: IFD