Witam! Poszukuję jakichkolwiek wskazówek jak napisać algorytm quicksort iteracyjnie bez używania rekurencji oraz stosu.
Quicksort nierekurencyjny
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
Oh snap, gdyby tylko istniała taka wyszukiwarka, która filtrowałaby zawartości różnych stron internetowych pod kątem wprowadzonych haseł.
Na przykład coś takiego: http://lmgtfy.com/?q=iterative+quicksort
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
http://alienryderflex.com/quicksort/
Wiesz, szukane wyrażenie można rozbudować - iterative quicksort without stack nadal zwraca rezultaty ;-)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 4
Co oznacza #define MAX_LEVELS 300? Czy da się to jakoś zastąpić?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 78
@any ma słuszność, nie zawsze szukanie w googlach jest najlepszym rozwiązaniem. Po co wtedy fora? Fakt, trafił tutaj z trudnym problemem, ale to nie powód żeby odsyłać go do googli. Ja zamiast do googli odeślę do konkretnego źródła. Algorytmy i Struktury danych, K.Diks, W.Rytter, L.Banachowski.
Idea jest taka, że stos wciąż istnieje, ale organizujesz go na liczbach ciągu. Ale ten stos to pamięć O(1), więc jakby go nie ma ;). To jest dość trudne, nie potrafiłbym tego z miejsca wytłumaczyć. Najpierw przekontempluj wersję (także w tej książce) z stosem rozmiaru O(log n), a potem ten drugi.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1039
Idź do księgarni i poproś o Cormena. Następnie zarezerwuj pół roku i czytaj od deski do deski ;). Lepszej porady nie dostaniesz.
- Rejestracja: dni
- Ostatnio: dni
any napisał(a):
Witam! Poszukuję jakichkolwiek wskazówek jak napisać algorytm quicksort iteracyjnie bez używania rekurencji oraz stosu.
Nie ma takiej wersji.
Iteracyjna wersja ma jawny stos... o rozmiarze minimum 2log(n);
czyli nieduży, np. 2*20 indeksów trzeba pamiętać dla n = milion;
no, ale w fatalnym przypadku rozmiar stosu może sięgać nawet n.
Zupełnie bez stosu, i o podobnej szybkości: nlogn, jest np. sortowanie stogowe;
- Rejestracja: dni
- Ostatnio: dni
to nie jest prawda, trzeba z tym stosem sprytnie postępować.
Wtedy zapewne otrzymasz coś zupełnie innego od quicksort... np. slowsort. :)
A tak w ogóle ten qsort i tak jest zwykle słaby, o czym sam się przekonałem przy sortowaniu słownika.
Mając słownik np. 100000 słówek na dysku, można tak zrobić aby to posortować:
A. czytamy cały słownik do tablicy, a potem odpalamy na tym qsort.
B. czytam po jednym słówku i od razu wsadzam go do tablicy w odpowiednim miejscu - za pomocą wyszukiwania binarnego.
Która wersja będzie szybsza?
Wesja II jest szybsza i do tego potężnie - chyba z 50 razy!
- Rejestracja: dni
- Ostatnio: dni
pelikan napisał(a):
Wesja II jest szybsza i do tego potężnie - chyba z 50 razy!
"Różne wersje sortowań mają różne wyniki przy innych danych"
No kto by kurde się tego spodziewał :P.
- Rejestracja: dni
- Ostatnio: dni
Smutny Ogórek napisał(a):
pelikan napisał(a):
Wesja II jest szybsza i do tego potężnie - chyba z 50 razy!
"Różne wersje sortowań mają różne wyniki przy innych danych"
No kto by kurde się tego spodziewał :P.
W tym przypadku nie zależy od danych, bo słownik jest ten sam!
Zresztą nietrudno wykazać że qsort jest w tym przypadku gorsza od metody... powiedzmy 'binarnego wstawiania' - BInsert.
Przy sortowaniu słów (stringów, np. do 20 znaków) decyduje liczba porównań, a nie kopiowań.
Wiemy że metoda qsort ma nlog(n) porównań, natomiast BI ma tyle:
log1 + log(2) + log(3) + ... log(n)
ile to jest - więcej czy mniej od: n x log(n)?
Pewnie że mniej:
n x logn = logn + logn + ... logn > log1 + log2 + ... logn;
albo tak:
n log n = log(n^n), natomiast BI: log1 + log(2) + log(3) + ... log(n) = log(n!);
log(n^n) > log(n!);
- Rejestracja: dni
- Ostatnio: dni
U Wirtha Algorytmy+struktury danych=programy jest przykładowy kod ale używa stosu
W przypadku sortowania przez scalanie można było zapisać algorytm iteracyjnie pomijając etap dzielenia
tutaj mamy dwa wywołania rekurencyjne i tylko jedno stosunkowo łatwo jest zastąpić pętlą