background image

Sortowanie tablic

dr inż. Andrzej Obuchowicz
Algorytmy i struktury danych

background image

Drzewo decyzyjne 
sortowania

a

b

b

c

a

c

b

c

a

c

a

b

c

c

b

a

b

a

c

b

c

a

 

c

a

b

a

c

b

 

background image

Dolne ograniczenie 
złożoności

L e m a t   :   K a ż d e   d r z e w o   b i n a r n e   o   w y s o k o ś c i       m a   c o   n a j w y ż e j   2

h

  l i ś c i .

D o w ó d   :   P r z e z   i n d u k c j ę

  =   0     t o   m a m y   p o j e d y n c z y   e l e m e n t   c z y l i       2

h

  =   2

0

  =   1 ;

n i e c h   d l a   w y s o k o ś c i     d r z e w o   b i n a r n e   p o s i a d a   c o   n a j w y ż e j   2

h

  l i ś c i

t o

d r z e w o   b i n a r n e   o   w y s o k o ś c i       +   1   m o ż n a   p o d z i e l i ć   n a   k o r z e ń   i   d w a   p o d d r z e w a   o

w y s o k o ś c i     o   c o   n a j w y ż e j   2

h

  l i ś c i a c h ,   m a m y   z a t e m   2 * 2

h

  =   2

+ 1  

l i ś c i .

T w i e r d z e n i e   :   K a ż d e   d r z e w o   d e c y z y j n e   s o r t u j ą c e     r ó ż n y c h   e l e m e n t ó w   m a   w y s o k o ś ć   c o   n a j m n i e j

l o g !

.

D o w ó d   :   P o n i e w a ż   w y n i k i e m   p o s o r t o w a n i a   m o ż e   b y ć   k a ż d a   z   !   p e r m u t a c j i   c i ą g u   w e j ś c i o w e g o ,

w i ę c   d r z e w o   d e c y z y j n e   p o s i a d a ć   m u s i   !   l i ś c i ,   s t ą d

2

2

h

n

h

n

!

l o g

!

W n i o s e k   :   K a ż d y   a l g o r y t m   s o r t u j ą c y   c i ą g   - e l e m e n t o w y   z a   p o m o c ą   p o r ó w n a ń   w y k o n u j e   c o

n a j m n i e j   c n

n c

l o g

(

)

 0  p o r ó w n a ń   d l a  d o s t a t e c z n i e  d u ż e g o   .

D o w ó d   :   Z a u w a ż m y ,   ż e   :

 

n

n

n n

n

n

n

n

n

n

n

n

n

n

 

1

1

2

2

2

2

2

4

2

2

!

. . .

/

/

l o g !

l o g

/

/

l o g

/

/

l o g

/

/

background image

Sortowanie przez 
wstawianie

9

8

9

1

3

4

2

6

5

1

8

9

1

3

4

2

6

5

3

1

8

9

3

4

2

6

5

4

1

3

8

9

4

2

6

5

2

1

3

4

8

9

2

6

5

6

1

2

3

4

8

9

6

5

5

1

2

3

4

6

8

9

5

1

2

3

4

5

6

8

9

background image

Sortowanie przez 
wstawianie c.d.

begin
     for i
:=2 to n do begin
          t
[0]:=t[i];  j:=i-1;
          while t
[0].klucz<t[j].klucz 

do begin

               t[j+1]:=t[j];  j:=j-1
          end;
          t
[j+1]:=t[0]
     end
end;

P

RZESTAWIENIA

P

ORÓWNANIA

M

IN

n-1

2(n-1)

Ś

R

.

(n

2

+n-2)/4

(n

2

+9n-10)/4

M

AX

(n

2

+n)/4 - 1

(n

2

+3n-4)/2

background image

Sortowanie przez wstawianie 
połówkowe

begin
     for i
:=2 to n do  begin
          t
[0]:=t[i]; l:=1; p:=i-1;
          while l
<=p do  begin
               m
:=(l+p) div 2;
               if t
[0].klucz<t[m].klucz

then  p:=m-1 else l:=m+1

          end;
          for j
:=i-1 downto l do t[j+1]:=t[j];
          t
[l]:=t[0]
     end
end;

P

RZESTAWIENIA

P

ORÓWNANIA

M

IN

n-1

n(logn-loge±0.5)

Ś

R

.

(n

2

+n-2)/4

n(logn-loge±0.5)

M

AX

(n

2

+n)/4 - 1

n(logn-loge±0.5)

background image

Sortowanie przez 
wybieranie

8

9

1

3

4

2

6

5

1

9

8

3

4

2

6

5

1

2

8

3

4

9

6

5

1

2

3

8

4

9

6

5

1

2

3

4

8

9

6

5

1

2

3

4

5

9

6

8

1

2

3

4

5

6

9

8

1

2

3

4

5

6

8

9

background image

Sortowanie przez 
wybieranie c.d.

begin
     for i
:=1 to n-1 do  begin
          k
:=i;  t[0]:=t[i];
          for j
:=i+1 to n do
              if t
[j].klucz<t[0].klucz then  begin
                   k
:=jt[0]:=t[j]
              end;
          t
[k]:=t[i]; t[i]:=t[0]
     end
end;

P

RZESTAWIENIA

P

ORÓWNANIA

M

IN

3(n-1)

(n

2

-n)/2

Ś

R

.

?

(n

2

-n)/2

M

AX

trunc(n

2

/4)+ 3(n-1)

(n

2

-n)/2

background image

Sortowanie bąbelkowe

8

9

1

3

4

2

6

5

8

1

3

4

2

6

5

9

1

3

4

2

6

5

8

9

1

3

2

4

5

6

8

9

1

2

3

4

5

6

8

9

1

2

3

4

5

6

8

9

1

2

3

4

5

6

8

9

1

2

3

4

5

6

8

9

background image

Sortowanie bąbelkowe 
c.d.

begin
     for i
:=n-1 downto 1 do
         for j
:=1 to i do
             if t
[j].klucz>t[j+1].klucz then begin
                  t
[0]:=t[j]; t[j]:=t[j+1]; t[j+1]:=t[0]
             end;
end;

P

RZESTAWIENIA

P

ORÓWNANIA

M

IN

0

(n

2

-n)/2

Ś

R

.

3(n

2

-n)/4

(n

2

-n)/2

M

AX

3(n

2

-n)/2

(n

2

-n)/2

background image

Sortowanie szybkie 
(quicksort)

8

9

1

3

4

2

6

5

2

1

3

9

4

8

6

5

1

2

3

5

4

6

8

9

1

2

3

4

5

6

8

9

background image

Sortowani
e
szybkie 
c.d.

Procedure podzial(f,l:integer); 
i,j,:integer; pomoc: {typ elementu tablicy}
begin

pomoc:=t[(f+l)div 2]; i:=f; j:=l;
repeat
while t[i]<pomoc do i:=i+1;
while t[j]>pomoc do j:=j-1;
if i<=j then begin 
    t[0]:=t[i]; t[i]:=t[j]; t[j]:=t[0];
    i:=i+1; j:=j-1;
end;
until i>j

     if f<j then podzial(f,j);
     if i<l then podzial(i,l);
end;

Startujemy od

podzial(1,n);

background image

Sortowanie stogowe 
(heapsort)

9,8,7,6,3,5,2,4

7

6

8 3

9

2

4

5

7

6

8 3 9 2

4

5

7

4

6 3 5 2

8

9

7

6

8 3 5 2

4

9

7,4,5,8,3,9,2,6

9

4

6 3 5 2

8

7

background image

Sortowanie stogowe c.d. 
(1)

Procedure przeczesz(r,b);
var ok:boolean; mc:integer
begin

ok:=false;
while (2*r<=b) and not ok do begin
if 2*r=b then mc:=2*r else 
       if t[2*r]>t[2*r+1] then mc:=2*r else mc:=2*r+1;
if t[r]<t[mc] then begin 
       t[0]:=t[r]; t[r]:=t[mc]; t[mc]:=t[0]; r:=mc end;
else ok:=true
end;

end;

background image

Sortowanie stogowe c.d. 
(2)

Procedure heapsort;
var i:integer;
begin

for i:=(n div 2) downto 1 do przeczesz(i,n);
for i:=n downto 2 do begin

t[0]:=t[1]; t[1]:=t[i]; t[i]:=t[0];
przeczesz(1,i-1)

end;

end;


Document Outline