Znalazłem sposób, który poprawia (o ile testowałem) algorytm quicksort poza to, co już zostało zrobione. Pracuję nad testowaniem tego, a potem chcę się o tym dowiedzieć. Jednak byłbym wdzięczny za pomoc w niektórych sprawach. Oto moje pytania. Cały mój kod jest w C++ przy okazji.Kilka pytań o sortowanie
Jednym z rodzajów, w porównaniu do mojego quicksort, jest std :: sort z biblioteki standardowej C++. Wydaje się jednak, że jest bardzo powolny. Sortuję tylko tablice int i longs, ale wydaje mi się, że są one około 8-10 razy wolniejsze od obu quicksortów i standardowego quicksortu Bentleya i McIlroy'a (i może Sedgewicka). Czy ktoś ma jakieś pomysły, dlaczego jest tak powolny? Kod, którego używam do sortowania, to tylko std :: sort (a, a + numelem); gdzie a jest tablicą longs lub ints i numelem jest liczbą elementów w tablicy. Liczby są bardzo losowe i próbowałem różnych rozmiarów, a także różnych ilości powtarzanych elementów. Próbowałem też qsort, ale jest jeszcze gorzej, jak się spodziewałem. Edytuj: zignoruj to pierwsze pytanie - zostało rozwiązane.
Chciałbym znaleźć więcej dobrych implementacji quicksort do porównania z moim quicksort. Do tej pory mam wersję Bentley-McIlroy, a także porównałem ją z pierwszą opublikowaną wersją dwumiejscowego quicksort Vladimira Yaroslavskiego. Ponadto planuję przeniesienie timsorta (który jest sortowaniem według mnie) i zoptymalizowanego quicksortu z dwoma pivotami ze źródła jdk 7. Jakie inne dobre implementacje quicksorts znasz? Jeśli nie są w C lub C++, to może być w porządku, ponieważ jestem całkiem dobry w przenoszeniu, ale wolałbym te C lub C++, jeśli je znasz.
Jak poleciłbyś poznać słowo o moich dodatkach do quicksort? Do tej pory mój quicksort wydaje się być znacznie szybszy niż wszystkie inne quicksorts, które testowałem to przeciwko. Głównym źródłem jego szybkości jest to, że obsługuje on powtarzające się elementy znacznie wydajniej niż inne metody, które znalazłem. Niemal całkowicie eliminuje zachowanie najgorszego przypadku, nie dając wiele czasu na sprawdzenie powtarzających się elementów. Pisałem o tym na forach Java, ale nie otrzymałem odpowiedzi. Próbowałem też napisać do Jona Bentleya, ponieważ pracował z Vladimirem nad jego podwójnym pchnięciem i nie otrzymał żadnej odpowiedzi (chociaż nie byłem tym strasznie zaskoczony). Czy powinienem napisać o tym artykuł i umieścić go na arxiv.org? Czy powinienem publikować posty na niektórych forach? Czy istnieje lista mailingowa, którą powinienem opublikować? Pracuję nad tym od jakiegoś czasu i moja metoda jest prawidłowa. Mam pewne doświadczenie w publikowaniu badań, ponieważ jestem doktorantem w dziedzinie fizyki obliczeniowej. Czy powinienem spróbować skontaktować się z kimś z wydziału informatyki na moim uniwersytecie? Nawiasem mówiąc, opracowałem także inny podwójny przegubowy quicksort, ale nie jest on lepszy niż mój quicksort z jednym pivotem (choć jest lepszy niż podwójny pchnięcie Vladimira z niektórymi zbiorami danych).
Bardzo dziękuję za pomoc. Chcę tylko dodać, co mogę, do świata komputerów. Nie interesuje mnie opatentowanie tej czy innej absurdalnej rzeczy.
Proszę mi powiedzieć, że kompilowałeś i profilowałeś z włączonymi optymalizacjami. – GManNickG
Może się to wydawać naprawdę oczywiste, ale kiedy używasz 'std :: sort', czy masz włączone pełne optymalizacje? Bez nich - zależna od implementacji "- może być znaczny nadmiar wywołania funkcji. W przeciwnym razie prawdopodobnie pomógłbyś, gdyby opublikowałeś swój kod i czasy względne. Rzeczywista wydajność 'qsort' i' std :: sort' będzie zależna od implementacji. –
głupie pytanie (tylko dlatego, że mnie wcześniej ugryziono): czy masz zestaw testów daty? I nie wystarczy sprawdzić, czy dane wyjściowe są posortowane. Sprawdź również, czy każdy element wejściowy jest obecny na wyjściu. –