WdI, Ćwiczenia 01
Tomasz Waleń
Wydział Matematyki, Informatyki i Mechaniki, UW
Zadanie 1
Dane: ciąg n liczb a0, . . . , an−1złożony z zer i jedynek.
Wynik: permutacja ciągu a0, ..., an−1w której zera poprzedzają jedynki.
Dla ciągu
1, 0, 0, 1, 0, 1, 1 wynik powinien być
0, 0, 0, 1, 1, 1, 1.
Zadanie 1 - rozwiązanie 1
Algorytm 1: RozwiązanieBrutalne niech l0oznacza liczbę 0 w a0, . . . , an−1
niech l1oznacza liczbę 1 w a0, . . . , an−1 zwróć ciąg{0} × l0+{1} × l1
Niestety to jest oszustwo!
Bardziej eleganckie byłoby rozwiązanie w którym jedynie zamieniamy elementy miejscami.
Zadanie 1 - rozwiązanie 1
Algorytm 2: RozwiązanieBrutalne niech l0oznacza liczbę 0 w a0, . . . , an−1
niech l1oznacza liczbę 1 w a0, . . . , an−1 zwróć ciąg{0} × l0+{1} × l1
Niestety to jest oszustwo!
Bardziej eleganckie byłoby rozwiązanie w którym jedynie zamieniamy elementy miejscami.
Zadanie 1 - rozwiązanie 2
Algorytm 3: Rozwiązanie2 l =0
p = n− 1 while l < p do
if al=0 then l = l +1 end
else if ap=1 then p = p− 1 end
else
zamień zawartość ali ap
l = l +1 p = p− 1 end
end
Zadanie 1 - rozwiązanie 3
Algorytm 4: Rozwiązanie3 l =0
p = n− 1 while l < p do
while l < p and al=0 do l = l +1
end
while l < p and ap=1 do p = p− 1
end
if l < p then
zamień zawartość ali ap
l = l +1 p = p− 1 end
end
Zadanie 1 - schemat rozwiązania
0 1 ?
a0 az ai an−1
?
Zadanie 1 - schemat rozwiązania
0 1 ?
a0 az ai an−1
0
Zadanie 1 - schemat rozwiązania
0 1 ?
a0 az aiai+1 an−1
0
Zadanie 1 - rozwiązanie 4
Algorytm 5: Rozwiązanie3 z =0
i =0
while i < n do
// niezmiennik elementy a0, . . . , az−1mają wartości 0 // elementy az, . . . , ai−1mają wartości 1
if ai=0 then if i̸= z then
zamień zawartość aii az
end z = z +1 end
i = i +1 end
Zadanie 2
Dane: ciąg długości n, a0, . . . , an−1złożony z liter C, B i N.
Wynik: permutacja ciągu a0, . . . , an−1w której litery C poprzedzają litery B a litery N są na końcu.
Dla ciągu
B,C,C,N,B,N,C,B wynikiem powinien być ciąg
C,C,C,B,B,B,N,N
Zadanie 2 - schemat rozwiązania
C B ? N
a0 ac ab am an−1
?
Zadanie 2 - rozwiązanie
Algorytm 6: Flaga Holenderska - rozwiązanie c =0; b = 0; m = n− 1
while b≤ m do
// niezmiennik:∀0≤j<caj= C,∀c≤j<baj= B,∀m<j<naj= N switch ab do
case C do
if c̸= b then zamień aci ab
b = b +1 c = c +1 case B do
b = b +1 case N do
if b̸= m then zamień ami ab
m = m− 1 end
end