» »

urejanje - python

urejanje - python

ktka ::

Napisala sem program za urejanje seznama s stresanjem.
Zanima me, kaj naj program naredi v naslednjih primerih:
- []
- [2,3]
- [3,2]
- [1,2,3,4,5]
- [5,4,3,2,1]

Ali je smiselno da program vrne za rezultat prazen seznam ali izjemo?
Ali je smiselno, da prvotni seznam pogledamo, če je že urejen, in če je ne urejamo ponovno?

phyro ::

Ali je smiselno da program vrne za rezultat prazen seznam ali izjemo?

python vrne []. Lahko si predstavljaš da je seznam že v naraščajočem/padajočem vrstnem redu.
Ali je smiselno, da prvotni seznam pogledamo, če je že urejen, in če je ne urejamo ponovno?

jaz ne bi tega delal, razen če je v dosti primerih že sortiran in mogoče s tem kaj pridobiš na času, ampak načeloma ne.

v unih primerih pa ne vem kaj te muči, odvisno al sortiraš padajoče al naraščajoče, ti pač program sortira primerno

ktka ::

ok. potem ne rabim nobenih izjem.
Potem izgleda to tako:(v unittestu)


import unittest
from urejanje import *

class Urejanje(unittest.TestCase):

    def urejanjeZstresanjem(self):
        #seznam z enim elementom
        self.asserEqual([1],[1])
        #seznam z dvema elementoma
        self.assertEqual([1,2],[1,2])
        self.assertEqual([3,2],[2,3])
        #prazen seznam
        self.assertEqual([],[])
        #naraščajoče urejen seznam
        self.assertEqual([1,2,3,4],[1,2,3,4])
        #padajoče urejen seznam
        self.assertEqual([4,3,2,1],[1,2,3,4])
        
        #števila od 1 do 15, na sodih mestih seznama so soda števila, na lihih pa liha števila
        self.assertEqual([2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
        #vsi elementi seznama so enaki
        self.assertEqual([2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2])
        #vsak element seznama nastopa trikrat
        elf.assertEqual([[12,42,94,18,6,12,42,94,18,6,12,42,94,18,6],[6, 6, 6, 12, 12, 12, 18, 18, 18, 42, 42, 42, 94, 94, 94]])

        #seznam dolžine 20 iz naključnih števil med 1 in 100
        #>>> import random
        #>>> sez = []
        #>>> for i in range(20):
	#sez.append(random.randint(1,100))
        #>>> print(sez)
        #[26, 63, 43, 39, 11, 52, 51, 61, 20, 37, 42, 77, 63, 29, 61, 68, 98, 66, 33, 45]
        self.assertEqual([26, 63, 43, 39, 11, 52, 51, 61, 20, 37, 42, 77, 63, 29, 61, 68, 98, 66, 33, 45],[11, 20, 26, 29, 33, 37, 39, 42, 43, 45, 51, 52, 61, 61, 63, 63, 66, 68, 77, 98])

	


if __name__ == '__main__':
    unittest.main()

Zgodovina sprememb…

  • spremenila: ktka ()

phyro ::

self.assertEqual([3,2],[2,3])

si mogoce mislila kaj v stilu:
self.assertEqual(sortiraj([3,2]),[2,3])
? ker drugače trdiš da sta seznama [3,2] in [2,3] enaka, kar pa ni res

ktka ::

ups...pozabla...hvala za opomin!

ktka ::

še eno pomoč bi rabila:
moj algoritem:
def urejanjeSstresanjem(seznam):
    '''Funkcija, ki uredi neurejen seznam, tako da med sabo primerja
    elemente seznama. V lihih korakih začne primerjati na koncu seznama,
    v sodih korakih pa od leve proti desni.
    Ko pregleda cel seznam, poišče najmanjše število seznama, ki je
    postavljeno na začetek seznama. V drugem koraku primerja vse elemente
    seznama brez tistega, ki je postavljen na začetek, torej tistega, ki je
    najmanjši. 
    Algoritem ponavljamo dokler seznam ni urejen.'''
    #primer:[8,4,5,2]
    n = len(seznam) #dolžina seznama
    #pregled vseh elementov seznama iz desne proti levi
    for i in range(n-1,-1,-1):
        
        #pregled elementov seznama iz desne proti levi
        #poiščemo najmanjši element, ki ga postavimo na začetek seznama
        #tega elementa v naslednjih korakih ne primerjamo več
        for j in range(i,0,-1):
            if seznam[j] < seznam[j-1]: #primerjamo po dva elementa seznama
                #če je eden manjši od drugega
                #zamenjamo jima mesta v seznamu
                seznam[j],seznam[j-1] = seznam[j-1],seznam[j]
                
                #za zgornji primer
                #[8, 4, 2, 5]
                #[8, 2, 4, 5]
                #[2, 8, 4, 5]
               
        #pregled elementov seznama iz leve proti desni
        #poiščemo največji element, ki ga postavimo na zadnje mesto seznama
        #tega elementa v naslednjih korakih ne primerjamo več
        for j in range(i):
           if seznam[j] > seznam[j+1]: #primerjamo po dva elementa seznama
                #če je eden večji od drugega
                #zamenjamo jima mesta v seznamu
                seznam[j],seznam[j+1] = seznam[j+1],seznam[j]
                
                #za zgornji primer
                #[2, 4, 8, 5]
                #[2, 4, 5, 8]
                
    #na koncu vrnemo urejen seznam
    return seznam



Potrebujem pomoč pri časovni zahtevnosti:

ČASOVNA ZAHTEVNOST ALGORITMA:

V najslabšem primeru: O(n^2)

V najboljšem primeru: O(n)

Pričakovana časovna zahtevnost: O(n^2)

Ali so najslabši primeri naslednji? Ali so to najboljši primeri?

- self.assertEqual(urejanjeSstresanjem([1]),[1])
- self.assertEqual(urejanjeSstresanjem([1,2,3,4]),[1,2,3,4]
- self.assertEqual(urejanjeSstresanjem([4,3,2,1]),[1,2,3,4])
- self.assertEqual(urejanjeSstresanjem([2,2,2,2,2,2,2,2]),[2,2,2,2,2,2,2,2])


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10318131 (8879) black ice
»

Python

Oddelek: Programiranje
203048 (1734) d_DJ
»

[Raptor] Razcep na prafaktorje

Oddelek: Šola
242449 (1991) Math Freak
»

Coursera naloga (python)

Oddelek: Programiranje
161980 (1608) jype
»

Python - pomoč!

Oddelek: Programiranje
71237 (1073) lknix

Več podobnih tem