Algorytm dla danych czesciowo posortowanych

0

Jaki jest najszybszy algorytm sortowania dla danych już częściowo posortowanych?
Quick sort zupełnie się nie nadaje bo dla takich danych ma zlozonosc n^2, merge sort będzie zawsze działał ze złożonością n log n heap sort podobnie (chyba).
Może bubble sort nie jest złym wyborem?

0

A to nowość że quicksort ma n^2 dla częściowo posortowanych danych. Możesz przybliżyć kto ci takich głupot naopowiadał? Pesymistyczny przypadek quicksorta zależy choćby od doboru pivota i tego czy to Lomuto czy Hoar...
Moim zdaniem quicksort z pivotem jako środkowym elementem byłby najlepszym wyjściem bo dla częściowo posortowanych danych, wręcz przeciwnie, jest całkiem niezły.
Bąbelki? :D Bubblesort jest zły zawsze! Chyba nie istnieje przypadek kiedy byłby najlepszym rozwiązaniem ;] Jak już chcesz proste sortowanie (bo np. masz prawie całkiem posortowane dane) to proste wstawianie - insertionsort.

0

Shalom - zastanow sie zanim zaczniesz pisać, że ktoś wygaduje bzdury.
QuickSort działa dobrze dla danych o rownomiernym rozkładzie. Dla danych częściowo posortowanych zaczyna się degenerować (chociażby dlatego powstało takie sortowanie: http://en.wikipedia.org/wiki/Introsort). Nie mówie, że zawsze będzie osiągać n^2 ale prawdopodobieństwo, że osiągnie jest większe niż w przypadku losowych danych.
Insertionsort mógłbym się zgodzić ale z bubble sort znowu pierdzielisz.

0

Pesymistyczny przypadek quicksorta zależy od sposobu wybierania pivota (nie wierzysz? to wymyśl sobie jakiś zbiór liczb i ułóż z nich pesymistyczny ciąg dla quicksorta choćby z pivotem jako środkowym elementem i powiedz czy wygląda ci to na posortowany ciąg). Jeśli będzie to element skrajny to faktycznie dla posortowanych danych dostaniesz O(n^2). No ale kto normalny, wiedząc że dane mogą być częściowo posortowane, będzie go tak wybierał...
A co do bąbelków, to prosze bardzo, wykaż że sie mylę (a bardzo prawdopodobne że tak jest) i pokaż przykład danych dla których bąbelki będą szybsze od prostego wstawiania albo prostego wybierania.
Bo z tego co zapamiętałem z zajęć na których liczyliśmy złożoność tych 3 algorytmów, to niestety ale bąbelki wypadały znacznie gorzej (jeśli chodzi o stałe ukryte w notacji O).

0

Pesymistyczny przypadek quicksorta zależy od sposobu wybierania pivota (nie wierzysz? to wymyśl sobie jakiś zbiór liczb i ułóż z nich pesymistyczny ciąg dla quicksorta choćby z pivotem jako środkowym elementem i powiedz czy wygląda ci to na posortowany ciąg). Jeśli będzie to element skrajny to faktycznie dla posortowanych danych dostaniesz O(n^2). No ale kto normalny, wiedząc że dane mogą być częściowo posortowane, będzie go tak wybierał...

Nie kumasz... Dane częściowo posortowane mogą być na milion różnych sposobów i nie znajdziesz dobrego pivotu, który nigdy nie da pesymistycznej złożoności. Dlatego powstało chociażby introsort).

A co do bąbelków, to prosze bardzo, wykaż że sie mylę (a bardzo prawdopodobne że tak jest) i pokaż przykład danych dla których bąbelki będą szybsze od prostego wstawiania albo prostego wybierania.

LOL. Sortowanie przez wybieranie to jedzie pełną parą O(n^2) nawet dla danych całkowicie posortowanych. Bąbelki dla danych całkowicie posortowanych mają złożoność O(n). A nad przykładem pomyśle jutro, ale generalnie liczyłem, że ktoś na 4p będzie miał jakieś doświadczenia z takim problemem.

0

@nzz w ogóle o co sie tak puszysz ?
dostałeś odpowiedź od Shalom-a która jest poprawna. Upierasz sie przy sortowaniu bąbelkowym. Zatem średni z Ciebie programista (bez urazy), lepiej by było jakbyś chociąz Shake Sort popierał. Bąbelkowe ma O(n) tylko dla przypadku całkowicie posortowanego ale i tu zauważ ze musi wykonac n-1 porównań. Innaczej będzie w sortowaniu przez wstawianie. Niezmiennikiem pętli jest posiadanie dwóch tablic - jednej posortowanej a drugiej nie. Więc jeżeli masz GDZIEŚ w zbiorze wejściowym (do posortowania) podzbiór już posortowany to wykonujesz porównania reszty tablicy z tą posortowaną częścią. Istnieje prawdobodobieństwo ze wykona sie to w czasie O(n).
Co do quick Sorta którego tak nie cierpisz - zawsze mozna dobrac tak pivota że sortowanie przebiegnie w dobrym czasie - chyba Knuth (bo Cormen raczej nie) pisał jak mozna oszacowac miejsce pivota. Jednak aparat matematyczny wykorzystywany w celu jego oszacowania do prostych nie należy.
Pozdrawiam

0

ja się też dziwie zadałeś pytanie dostałeś odpowiedź i się dąsasz. Jak wiesz lepiej to po co pytasz?
Ostatecznie, jak masz wątpliwości to napisz jakieś benchmarki dla najczęściej występującego w twoim programie zestawu danych i je porównaj. Nie jest to trudne ani bardzo czasochłonne, a będziesz miał odwiedź, z którą raczej nie będziesz dyskutował :P.

0

dla danych czesciowo posortowanych w specyficzny sposob: bitonic sort - wymaga, aby ciag danych byl dwumonotoniczny, tzn. zeby byl wstepnie posortowany w "trojkat": wartosci rosna-potem-maleja, albo maleja-potem-rosna

mimo mocnego ograniczenia a dane wejsciowe, mozna go latwo uogolnic - po 'zagniezdzeniu' hmmm... chyba log(n).. instancji algorytmu, otrzymuje sie sortowanie bez zalozenia na dane wejsciowe (lub, zaleznie jak mocno go sie zagniezdzi 'w sobie', pozostaje wymaganie dwumonotonicznosci na rozlacznych przedzialach). no i owa ogolna postac calkiem niezle sie zrownolegla, a na architekturze hiperkostki to juz w ogole:)

  • niemniej, uwaga: bitonic sort w każdj postaci ma złozoność czasową niezalezna od wartosci danych! ona zalezy od N i od wybranej przez Ciebie liczby zagniezdzen. fakt, ze Twoje dane sa czesciowo posortowane jest informacja dla Ciebie, i dzieki nej mozesz wybrac mniejszy poziom zagniezdzen lub po prostu narzucic swoj sposob podzialu na podzbiory bitoniczne, ktore potem beda łączone - podstaowwy algorytm tego sam za Ciebie nie zrobi!
0

Nie dąsam się tylko mnie takie teksty denerwują:

Możesz przybliżyć kto ci takich głupot naopowiadał

I to co Shalom odpowiedział wcale nie jest poprawne nie mówiąc już o polecaniu sortowania przez wybór [rotfl]

A pytam się bo może ktoś miał już doświadczenia z takimi algorytmami, sam przeprowadzał benchmarki i ma ochotę się podzielić wiedzą.

0
Shalom napisał(a)

Bąbelki? Bubblesort jest zły zawsze! Chyba nie istnieje przypadek kiedy byłby najlepszym rozwiązaniem Jak już chcesz proste sortowanie (bo np. masz prawie całkiem posortowane dane) to proste wstawianie - insertionsort.

sortowanie dwóch liczb ;p

0

a może zdradź na czym polega to częściowe posortowanie. Wtedy może się okazać, że odpowiedź jest prostsza niż ci się wydaje.

0

IMHO, autor pod tym rozumieuklad danych wejsciowych, ktory w pewnych przedzialach (pewnie szerokosci wiekszej niz 2 elementy :))))) ) jest juz posortowany zgodnie z oczekiwanymi zalozeniami, np. rzucenie kota na klawiature wygenerowalo takie cos, klamry oznaczaja "czesciowe posortowane podciagi o n.el.>2":
(uwaga: podciąg w rozumieniu przedzial.. )

6 5 9 8 5 6 3 (2 2 3 7 9) 4 7 3 8 4 2 7 3 9 4 7 2 (1 3 4 9) (2 3 4)
(oczywiscie to bez sensu.. w takim przypadku poszukaloby sie juz obu przypadkow: pod-posortowania zgodnego- i przeciwnego-, poneiwaz podciagi posortowane przeciwnie sa banalne w odwroceniu i wiedze o nich moznaby rownie latwo wykorzystac)

tylko, w takim ujeciu, czym to sie niby mialo roznic od klasycznego problemu sortowania? i czym ciag wejsciowy roznilby sie od kompletnie losowego? przeciez nawet w kompletnie losowych liczbach trafiaja sie gdzieniegdzie kilku-kilkunastoelementowe monotoniczne grupy..

jesli mialo by to cos dac, to musielibysmy ALBO apriori znac pozycje tychze posortowanych podciagow: majac je, wstepne podzielenie dziedziny problemu i algo pokroju mergesort sie klaniaja "i tyle". ALBO wiedzac ze wystapia sensownej dlugosci podciagi, przed wlasciwym sortowainem (lub w trakcie) sobie "szybko" przeleciec po zestawie i patrz wyzej.

pytanie, czy to nie zarżnie algorytmu dorzucajac ekstra N krokow zwiazanych z porownywaniem, przerzucaniem podciagow?
pytanie, jak tragiczna bedzie zlozonosc dla pesymistycznego przypadku (max. posort podciag = 2 elementy)

1 użytkowników online, w tym zalogowanych: 0, gości: 1