Sortowanie przez scalanie
Mariusz:
Cormen w swym pseudokodzie używa wartowników
i używa dwóch pomocniczych tablic zamiast jednej
Według mnie wartownicy są niepotrzebni
U niego procedura sortująca jest rekurencyjna
chociaż można ją zapisać iteracyjnie
(Wikipedia twierdzi że trzeba zacząć od łączena podtablic długości 1
w podtablice długości 2 itd)
14 mar 14:31
jc: Oto kod bez wartowników. Działa, ale coś nalezałoby poprawić. Sklejając przepisuję do tablicy
pomocniczej t[ ] pierwszy fragment, jednak przy sklejaniu iteracynym "sortuj2" pierwszy
fragment
może być prawie tak długi, jak cała tablica. Na pewno można to poprawić odwracając
kierunek ruchu w funkcji sortuj2 lub w funkcji sklej.
void sklej(int *p, int *s, int *k, int *t){
int *q, *r;
for( q = p, r = t; q < s; q++, r++)
*r = *q;
while(t < r && s < k)
if(*t < *s) *(p++) = *(t++);
else *(p++) = *(s++);
while(t < r) *(p++) = *(t++);
}
void sortuj(int * p, int * k, int* t){
if( k − p <= 1) return;
int * s = p + (k−p)/2 ;
sortuj(p,s,t);
sortuj(s,k,t);
sklej(p,s,k,t);
}
void sortuj2(int *p, int *k, int*t){
int *r;
int m;
for(m = 1; m < k−p; m *=2){
for(r = p; r < k−m; r += 2*m)
if(r+2*m < k) sklej(r, r+m, r+2*m, t);
else sklej(r, r+m, k, t);
}
14 mar 20:19
Mariusz:
Czyli złożoność jest zbliżona do quick sorta (oczywiście asymptotycznie) ?
Na wikipedii twierdzą że można zapisać procedurę sortującą iteracyjnie
bez straty złożoności czasowej
Twierdzą także że stracilibyśmy na złożoności czasowej gdybyśmy chcieli zaimplementować
sortowanie przez scalanie w miejscu
14 mar 22:19
Mariusz:
Parę razy zapisałem sobie na kartce przebieg procedur sortujących przez scalanie
i mam jednak mam wątpliwości czy to że czasami podtablice nie będą miały mniej
więcej tyle samo elementów popsuje złożoność czasową
14 mar 22:27
jc: Usuń przypadkową klamerkę wewnątrz sortuj2(). Wykonałem doswiadczenie. Wydaje się,
że wersja iteracyjna działa o 10% szybciej. Teoretycznie pewnie tak samo szybko.
Przy okazji. Mam sortowanie przez scalanie wmiejscu, teoretycznie wolniejsze:
n (ln n)2, chodź mogę już dobrze nie pamiętać.
15 mar 01:48
Mariusz:
Działa ci ten kod bo jak go skopiowałem to nie przestawia elementów
15 mar 03:19
Mariusz:
W przypadku sortowania listy wystarczy przestawiać wskaźniki na następny
bądź poprzedni element
15 mar 03:32