React developer - razvojni put, saveti?

Cuj, bubble sort sluzi samo za edukativne svrhe, niko to ne koristi za neki stvarni program :P

Misliš? Pre nekih 7-8 godina, nasledili smo softver za popis artikala u jednom velikom supermarketu. Softver za DC je pisan u C-u, "baza" preko txt fajlova.. Artikala >60000 a sortiranje urađeno preko bubble sort. Trajalo po 5 i više minuta. Čovek naučio da koristi ugrađene funkcije za sortiranje i jedino što je znao , a da je morao sam da napiše, bio bubble sort. Da je bar koristio Insertion sort. Dakle, ne bi trebalo ali svašta se radi...
 
Poslednja izmena:
Misliš? Pre nekih 7-8 godina, nasledili smo softver za popis artikala u jednom velikom supermarketu. Softver za DC je pisan u C-u, "baza" preko txt fajlova.. Artikala >60000 a sortiranje urađeno preko bubble sort. Trajalo po 5 i više minuta. Čovek naučio da koristi ugrađene funkcije za sortiranje i jedino što je znao bio bubble sort. Da je bar koristio Insertion sort. Dakle, ne bi trebalo ali svašta se radi...
Pa kad supermarketi cicijase :p
 
nego evo vise sortova, koji su jasni ko dan u funkcionalnom jeziku kakav je Haskell:
ovo sam pisao, da bih merio efikasnost sortova u Haskell-u korisnost je sto se kapira
kako i sta lako.
Kod:
import Data.List
import qualified Test.QuickCheck as QC
import System.Random
import Criterion.Main
import Data.Bits
import qualified Data.Vector.Mutable as VM
import qualified Data.Vector as V
import Data.Word
import System.IO.Unsafe
import Data.Bits

lsdSort :: (Ord a, Bits a, Num a) => [a] -> [a]
lsdSort = fixSort positiveLsdSort

msdSort :: (Ord a, Bits a, Num a) => [a] -> [a]
msdSort = fixSort positiveMsdSort

-- Fix a sort that puts negative numbers at the end, like positiveLsdSort and positiveMsdSort
fixSort :: (Bits a, Ord a, Num a)=>([a]->[a]) -> [a] -> [a]
fixSort sorter list = uncurry (flip (++)) (break (< 0) (sorter list))

positiveLsdSort :: (Bits a) => [a] -> [a]
positiveLsdSort list = foldl step list [0..bitSize (head list)] where
    step list bit = uncurry (++) (partition (not . flip testBit bit) list)

positiveMsdSort :: (Bits a) => [a] -> [a]
positiveMsdSort list = aux (bitSize (head list) - 1) list where
    aux _ [] = []
    aux (-1) list = list
    aux bit list = aux (bit - 1) lower ++ aux (bit - 1) upper where
                  (lower, upper) = partition (not . flip testBit bit) list
msort :: Ord a =>[a] -> [a]
msort xs
  | n < 2 = xs
  | otherwise = merge (msort x1s) (msort x2s)
  where
    n = length xs
    (x1s,x2s) = splitAt (n`quot`2) xs
    merge xs ys = case (xs,ys) of
      ([], ys') -> ys'
      (xs', []) -> xs'
      (x:xs',y:ys') | x < y -> x : merge xs' ys
                    | otherwise -> y : merge xs ys'

isort :: Ord a => [a] -> [a]
isort xs = foldr insert [] xs
    where
        insert x [] = [x]
        insert x (y:ys) = if x<y then x:y:ys
                          else y: insert x ys

qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort [x] = [x]
qsort xs =
    let
        pivot = mot
        (x1s,x2s,pivots) = foldl (\(ys,zs,pivots) x->
                            if x<pivot
                            then (x:ys,zs,pivots)
                            else if x>pivot
                                 then (ys,x:zs,pivots)
                                 else (ys,zs,x:pivots)) ([],[],[]) xs
    in qsort x1s ++ pivots ++ qsort x2s
    where
          mot =
            let n = length xs
                (a,b,c) = (xs !! 0, (xs !! (n`quot`2)), xs !! (n-1))
            in if a>b
               then if a<c
                    then a
                    else if c>b
                         then c
                         else b
               else if b<c
                    then b
                    else if c>a
                         then c
                         else a

rsort :: [Word32] -> [Word32]
rsort xs = unsafePerformIO $ do
    let base = 16

        add_bucket :: Int -> Word32 -> VM.IOVector [Word32] -> VM.IOVector [Word32]
        add_bucket i n b = unsafePerformIO $ do
                        lst <- VM.read b i
                        VM.write b i (n:lst)
                        return b
        clear b = mapM_ (\i-> VM.write b i []) [0..base-1]
    bucket <- VM.replicate base [] :: IO (VM.IOVector [Word32])
    let loop = return $ foldl body xs [0..7]
            where
                body :: [Word32] -> Word32 -> [Word32]
                body nums n = unsafePerformIO $ do
                        v <- V.freeze (foldl disp bucket nums)
                        clear bucket
                        return $ V.foldr gather [] v
                    where
                        disp :: VM.IOVector [Word32]->Word32->VM.IOVector [Word32]
                        disp b val = add_bucket (fromIntegral ((val`shiftR`fromIntegral (n`shiftL`fromIntegral 2)).&.0xf)) val b
                        gather :: [Word32]->[Word32] -> [Word32]
                        gather b nums = foldl (\xs x->x:xs) nums b
    loop


prop_msort :: [Word32]->Bool
prop_msort xs = msort xs == sort xs && sort xs == isort xs && sort xs == qsort xs && sort xs == rsort xs &&
                lsdSort xs == sort xs && msdSort xs == sort xs

deepCheck p = QC.quickCheckWith (QC.stdArgs { QC.maxSize = 1000}) p

n :: Word32
n = 4096 * 16
tl :: [Word32]->[Word32]
tl = take (fromIntegral n)

main = do
    putStrLn $ "list size " ++ show n
    deepCheck prop_msort
    g <- getStdGen
    let rl = randomRs (0,n) g
    let (s,rs) = ([(0::Word32)..],[(n-1::Word32),n-2..])
    let rnd = tl rl
        srt = tl s
        rsrt = tl rs
    defaultMain [
        bgroup "msdSort" [
            bench "random"  $ nf msdSort rnd,
            bench "sorted"  $ nf msdSort srt,
            bench "reverse sorted"  $ nf msdSort rsrt
            ],
        bgroup "lsdSort" [
            bench "random"  $ nf lsdSort rnd,
            bench "sorted"  $ nf lsdSort srt,
            bench "reverse sorted"  $ nf lsdSort rsrt
            ],
        bgroup "qsort" [
            bench "random"  $ nf qsort rnd,
            bench "sorted"  $ nf qsort srt,
            bench "reverse sorted"  $ nf qsort rsrt
            ],
        bgroup "sort"  [
            bench "random" $ nf sort rnd,
            bench "sorted" $ nf sort srt,
            bench "reverse sorted" $ nf sort rsrt
            ],
        bgroup "msort" [
            bench "random" $ nf msort rnd,
            bench "sorted" $ nf msort srt,
            bench "reverse sorted" $ nf msort rsrt
            ],{-
        bgroup "isort" [
            bench "random" $ nf isort rnd,
            bench "sorted" $ nf isort srt,
            bench "reverse sorted" $ nf isort rsrt
            ],-}
        bgroup "rsort" [
            bench "random" $ nf rsort rnd,
            bench "sorted" $ nf rsort srt,
            bench "reverse sorted" $ nf rsort rsrt
            ]
        ]
    print $ take 10 $ rsort rnd
 
Ruby:
def bubble_sort(arr)
    index = 0
    pass = 0
        while pass < (arr.size**2)
            if arr[index] > arr[index+1]
               temp = arr[index]
               arr[index] = arr[index+1]
               arr[index+1] = temp                 
            end       
            index += 1
            pass += 1
            if index >= arr.size - 1
                index = 0
            end
        end
        return arr
end
p bubble_sort([4,3,78,2,0,2,6])

Moj tejk na bubble sort u programskom jeziku ruby. Igrom slucaja to mi je bio task da uradim sto se poklopilo sa ovom temom.
U Ruby ima kul metod sort sto ovo odradi ko od sale. samo kazes

arr.sort

i to je to. :D
 
Ne poznajem Ruby ali mi liči na Python koji , takođe, ne poznajem najbolje, da bi ovde pomogla promenljiva swapped da se ne kotrlja kroz petlju ukoliko je niz već sortiran već samo ako je bilo zamene. Isto mislim da index ne mora da pođe od 0 već može i od , otprilike, pass % (arr.size-1). Da se smanji broj prolazaka kroz petlju. Jel može u Rubby, da se u jednom redu izvrši zamena dve promenljive? Nešto kao: a,b=b,a...
 
Ruby:
def bubble_sort(arr)
    index = 0
    pass = 0
        while pass < (arr.size**2)
            if arr[index] > arr[index+1]
               temp = arr[index]
               arr[index] = arr[index+1]
               arr[index+1] = temp               
            end     
            index += 1
            pass += 1
            if index >= arr.size - 1
                index = 0
            end
        end
        return arr
end
p bubble_sort([4,3,78,2,0,2,6])

Moj tejk na bubble sort u programskom jeziku ruby. Igrom slucaja to mi je bio task da uradim sto se poklopilo sa ovom temom.
U Ruby ima kul metod sort sto ovo odradi ko od sale. samo kazes

arr.sort

i to je to. :D
Ne valja ti to. Pre svega sto to nije bubble, drugo, sto tvoj sort ne radi...
Dakle ideja je da prvo nadjes minimum niza, pa onda prelazis na sledeci podniz pa nalazis njegov minimum i tako do kraja.
Ovo tvoje samo poredi susedne elemente i nema gararancije da nece upasti u pelju da se nista ne swapuje, a da niz
nije sortiran...
 
Poslednja izmena:
Ne valja ti to. Pre svega sto to nije bubble, drugo, sto tvoj sort ne radi...
Dakle ideja je da prvo nadjes minimum niza, pa onda prelazis na sledeci podniz pa nalazis njegov minimum i tako do kraja.
Ovo tvoje samo poredi susedne elemente i nema gararancije da nece upasti u pelju da se nista ne swapuje, a da niz
nije sortiran...
U stvari, radice, mada ovo nikad do sad nisam video. Tu moze doci optimizacija, ukoliko se u prolazu
nije desio nijedan swap, onda znaci da je niz sortiran.
 
Ne poznajem Ruby ali mi liči na Python koji , takođe, ne poznajem najbolje, da bi ovde pomogla promenljiva swapped da se ne kotrlja kroz petlju ukoliko je niz već sortiran već samo ako je bilo zamene. Isto mislim da index ne mora da pođe od 0 već može i od , otprilike, pass % (arr.size-1). Da se smanji broj prolazaka kroz petlju. Jel može u Rubby, da se u jednom redu izvrši zamena dve promenljive? Nešto kao: a,b=b,a...
Moze, samo sto je to higher math za mene trenutno. Video sam resenja drugih ljudi, ima jedno gde je bas to uradjeno.
Ruby je slican na prvi pogled sa Python-om zato mi se i svidja. Ne volim kad u jeziku moram na kraju svake linije da stavljam ; ili da na svaki blok otvaram { };
ili if (uslov) {kod ovde}; obavezno negde zaboravis neku zagradicu ili tacku-zarez. Kad se setim u srednjoj smo radili u nekom turbo c ili je bio c++, napises 10 linija nekog koda, izadje 1100 gresaka jer si zaboravio zagradicu. :lol:
 
U stvari, radice, mada ovo nikad do sad nisam video. Tu moze doci optimizacija, ukoliko se u prolazu
nije desio nijedan swap, onda znaci da je niz sortiran.
Je, lose je tehnicko resenje jer u najgorem slucaju treba ti duzina niza - 1 koraka da ga sortiras. Nisam to mogao da smislim u tom trenutku pa mi je palo genijalno resenje da ga provrtim onoliko puta koliko ima elemenata u nizu. :lol: Bio mi je cilj samo da ga zavrsim id a idem dalje, ako budem imao vremena uzecu da ga prepravim. :D
 
bsort.png


Možda ovako nekako..
 
Je, lose je tehnicko resenje jer u najgorem slucaju treba ti duzina niza - 1 koraka da ga sortiras. Nisam to mogao da smislim u tom trenutku pa mi je palo genijalno resenje da ga provrtim onoliko puta koliko ima elemenata u nizu. :lol: Bio mi je cilj samo da ga zavrsim id a idem dalje, ako budem imao vremena uzecu da ga prepravim. :D
U svakom slucaju pre tebe ovo niko nije smislio, a da znam :P
 
A kako bi bubble sort u stvari trebao da izgleda? Msm ja ne umem da u jednom passu da mi proveri i sortira sve.

Ruby:
def bubble_sort(arr)
    index = 0
    pass = 0
    a = arr.max
    b = arr.min
    if a == arr[arr.size-1] && b == arr[0]
        return arr
    else
        while pass < (arr.size**2)
            if a == arr[arr.size-1] && b == arr[0]
                return arr
               
            else   
                if arr[index] > arr[index+1]
                temp = arr[index]
                arr[index] = arr[index+1]
                arr[index + 1] = temp       
                end     
                index += 1
                pass += 1
                if index >= arr.size - 1
                    index = 0
                end
            end         
        end
        return arr
    end
end
p bubble_sort([4,3,78,2,0,2])

Ovo je malo bolja varijanta, nece sortirati ako je niz vec sortiran i ako prepozna da je niz sortiran nece dalje vrteti loop kao pre gde je vrteo dok ne djodje do vrednosti pass.
 

Back
Top