• Nenhum resultado encontrado

Análise de Algoritmos

N/A
N/A
Protected

Academic year: 2022

Share "Análise de Algoritmos"

Copied!
66
0
0

Texto

(1)

Análise de Algoritmos

(2)

• Ordenação por comparação

▫ (n log n)

▫ Quicksort

▫ Heapsort

▫ Mergesort

• Ordenação em tempo linear

O(n)

▫ Countingsort

▫ Radixsort

▫ Bucketsort

www.nakamura.eti.br/eduardo Análise de Algoritmos 2

(3)

• Ordenação por contagem

▫ Pressupõe que cada um dos n elementos de entrada é um inteiro no intervalo de 1 a k, para algum inteiro k

▫ A ordenação é executada em (k+n)

• Idéia básica

▫ Determinar, para cada elemento de entrada x, o número de elementos menores que x

▫ Assim o elemento x pode ser inserido na posição correta

▫ Se há 13 elementos menores que x, então x ficará na posição 14

▫ Cuidado com valores iguais

www.nakamura.eti.br/eduardo Análise de Algoritmos 3

(4)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

• Entrada

A[1..n] – arranjo a ser ordenado

B[1..n] – arranjo de saída ordenado

k – o maior valor possível dentro do arranjo

• Além disso

C[0..k] – arranjo para

armazenamento temporário

www.nakamura.eti.br/eduardo Análise de Algoritmos 4

(5)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 5

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C

j = 1

(6)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 6

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 0 0 0 0

j = 1

(7)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 7

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 0 0 0 0

j = 1

(8)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 8

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 0 0 0

j = 1

(9)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 9

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 0 0 0

j = 2

(10)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 10

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 0 0 1

j = 2

(11)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 11

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 0 0 1

j = 3

(12)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 12

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 1 0 1

j = 3

(13)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 13

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 0 0 1 1 0 1

j = 4

(14)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 14

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 1 1 0 1

j = 4

(15)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  2 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 15

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 1 1 0 1

j = 5

(16)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 16

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 2 1 0 1

j = 5

(17)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 17

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 2 1 0 1

j = 6

(18)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 18

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 2 2 0 1

j = 6

(19)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 19

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 1 0 2 2 0 1

j = 7

(20)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 20

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 2 0 1

j = 7

(21)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 21

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 2 0 1

j = 8

(22)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 22

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 3 0 1

j = 8

(23)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 23

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 3 0 1

Para todo 0  i  k,

C[i] possui o número de

elementos iguais a i

(24)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 24

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 3 0 1

(25)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 25

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 0 2 3 0 1

i = 1

(26)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 26

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 2 3 0 1

i = 1

(27)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 27

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 2 3 0 1

i = 2

(28)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 28

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 3 0 1

i = 2

(29)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 29

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 3 0 1

i = 3

(30)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 30

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 0 1

i = 3

(31)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 31

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 0 1

i = 4

(32)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 32

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 7 1

i = 4

(33)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 33

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 7 1

i = 5

(34)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 34

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 7 8

i = 5

(35)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 35

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 7 8

Para todo 0  i  k,

C[i] possui o número de

elementos menores ou

iguais a i

(36)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 36

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B

0 1 2 3 4 5

C 2 2 4 7 7 8

j = 8

(37)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 37

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 3

0 1 2 3 4 5

C 2 2 4 7 7 8

j = 8

(38)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 38

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 3

0 1 2 3 4 5

C 2 2 4 6 7 8

j = 8

(39)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 39

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 3

0 1 2 3 4 5

C 2 2 4 6 7 8

j = 7

(40)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 40

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 3 3

0 1 2 3 4 5

C 1 2 4 6 7 8

j = 6

(41)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 41

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 2 3 3

0 1 2 3 4 5

C 1 2 4 5 7 8

j = 5

(42)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 42

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 0 2 3 3

0 1 2 3 4 5

C 1 2 3 5 7 8

j = 4

(43)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 43

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 0 2 3 3 3

0 1 2 3 4 5

C 0 2 3 5 7 8

j = 3

(44)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 44

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 0 2 3 3 3 5

0 1 2 3 4 5

C 0 2 3 4 7 8

j = 2

(45)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 45

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 0 2 2 3 3 3 5

0 1 2 3 4 5

C 0 2 3 4 7 7

j = 1

(46)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 46

k=5 1 2 3 4 5 6 7 8

A 2 5 3 0 2 3 0 3

1 2 3 4 5 6 7 8

B 0 0 2 2 3 3 3 5

0 1 2 3 4 5

C 0 2 2 4 7 7

(47)

COUNTINGSORT(A,B,k) 1: for i  0 to k do 2: C[i]  0;

3: end for

4: for j  1 to n do

5: C[A[j]]  C[A[j]]+1;

6: end for

7: for i  1 to k do

8: C[i]  C[i]+C[i-1];

9: end for

10: for j  n downto 1 do 11: B[C[A[j]]]  A[j];

12: C[A[j]]  C[A[j]]-1;

13: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 47

 2 k

) (

5 ) (

2 )

( n k n n k

T      

 1 n

 1 k

 1

n

(48)

• Ordenação por raiz

▫ Algoritmo usado por máquinas de cartão

▫ Peças de museu

• Princípio

▫ Ordena por dígito

▫ Do menos significativo para o mais significativo

www.nakamura.eti.br/eduardo Análise de Algoritmos 48

(49)

RADIXSORT(A,d)

1: for i  1 to d do

2: ORDENA A pelo dígito i;

3: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 49

(50)

www.nakamura.eti.br/eduardo Análise de Algoritmos 51

1 2 3 4 5 6 7 8

A 170 45 75 90 2 24 802 66

A

1 1 7 0

2 0 4 5

3 0 7 5

4 0 9 0

5 0 0 2

6 0 2 4

7 8 0 2

8 0 6 6

A

1 1 7 0

2 0 9 0

3 0 0 2

4 8 0 2

5 0 2 4

6 0 4 5

7 0 7 5

8 0 6 6

A

1 0 0 2

2 8 0 2

3 0 2 4

4 0 4 5

5 0 6 6

6 1 7 0

7 0 7 5

8 0 9 0 A

1 1 7 0

2 0 9 0

3 0 0 2

4 8 0 2

5 0 2 4

6 0 4 5

7 0 7 5

8 0 6 6

A

1 0 0 2

2 8 0 2

3 0 2 4

4 0 4 5

5 0 6 6

6 1 7 0

7 0 7 5

8 0 9 0

A

1 0 0 2

2 0 2 4

3 0 4 5

4 0 6 6

5 0 7 5

6 0 9 0

7 1 7 0

8 8 0 2

(51)

RADIXSORT(A,d)

1: for i  1 to d do

2: ORDENA A pelo dígito i;

3: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 52

Qual algoritmo você adaptaria

para ordenar pelo dígito?

(52)

RADIXSORT(A,d)

1: for i  1 to d do

2: ORDENA A pelo dígito i;

3: end for

RADIXSORT(A,d)

1: for i  1 to d do

2: ORDENA A pelo dígito i com o COUNTINGSORT;

3: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 53

(53)

RADIXSORT(A,d)

1: for i  1 to d do

2: ORDENA A pelo dígito i com o COUNTINGSORT;

3: end for

www.nakamura.eti.br/eduardo Análise de Algoritmos 54

) ( kn vezes 

d

( )

)

( n d n k

T   

(54)

• A i-ésima estatística de ordem de um conjunto de n elementos é o i-ésimo menor elemento

▫ O mínimo de um conjunto de n elementos é a primeira estatística de ordem (i = 1)

▫ O máximo de um conjunto de n elementos é a n-ésima estatística de ordem (i = n)

www.nakamura.eti.br/eduardo Análise de Algoritmos 55

(55)

• Ponto médio do conjunto

▫ Para n ímpar a mediana é única, ocorrendo em i = (n+1)/2

▫ Para n par existem duas medianas uma em i = n/2 outra em i = n/2 + 1

• Independente da paridade de n, as medianas são

▫ Mediana inferior em i = (n+1)/2

▫ Mediana superior em i = (n+1)/2

www.nakamura.eti.br/eduardo Análise de Algoritmos 56

(56)

• Entrada

▫ Um conjunto A de n números (distintos) e um número i, tal que 1  i  n

• Saída

▫ O elemento x  A que é maior que, exatamente, i – 1 outros elementos

• A i-ésima estatística de ordem de um conjunto A

www.nakamura.eti.br/eduardo Análise de Algoritmos 57

(57)

MINIMO(A)

1: MERGESORT(A,1,n);

2: return A[1];

MAXIMO(A)

1: MERGESORT(A,1,n);

2: return A[n];

www.nakamura.eti.br/eduardo Análise de Algoritmos 58

) log (

)

( n n n

T  

(58)

MINIMO(A)

1: MERGESORT(A,1,n);

2: return A[1];

MINIMO(A)

1: min  A[1];

2: for i  2 to n do 3: if A[i] < min then 4: min  A[i];

5: end if 6: end for

7: return min;

www.nakamura.eti.br/eduardo Análise de Algoritmos 59

) log (

)

( n n n

T  

) ( 1

)

( n n n

T    

(59)

MINIMO(A)

1: min  A[1];

2: for i  2 to n do 3: if A[i] < min then 4: min  A[i];

5: end if 6: end for

7: return min;

MAXIMO(A)

1: max  A[1];

2: for i  2 to n do 3: if A[i] > max then 4: max  A[i];

5: end if 6: end for

7: return max;

www.nakamura.eti.br/eduardo Análise de Algoritmos 60

) ( 1

)

( n n n

T    

(60)

MINMAX(A)

1: min  A[1];

2: max  A[1];

2: for i  2 to n do 3: if A[i] < min then 4: min  A[i];

5: end if

3: if A[i] > max then 4: max  A[i];

5: end if 6: end for

7: return [min,max];

www.nakamura.eti.br/eduardo Análise de Algoritmos 61

) ( )

1 (

2 )

( n n n

T    

(61)

MINMAX(A)

1: min  A[1];

2: max  A[1];

2: for i  2 to n do 3: if A[i] < min then 4: min  A[i];

5: end if

3: if A[i] > max then 4: max  A[i];

5: end if 6: end for

7: return [min,max];

www.nakamura.eti.br/eduardo Análise de Algoritmos 62

Da para fazer melhor?

Referências

Documentos relacionados

A união ou «comunhão» pessoal, a que o homem e a mulher são reciprocamente chamados «desde o princípio», não corresponde, pelo contrário está em contraste, a

Com base nos resultados da pesquisa referente à questão sobre a internacionalização de processos de negócios habilitados pela TI com o apoio do BPM para a geração de ganhos para

Este trabalho traz uma contribuição conceitual sobre a utilização do sistema de gestão de produtividade que poderá motivar futuras pesquisas sobre o tema, bem

classe de todos os problemas de decisão que podem ser resolvidos por algoritmos polinomiais.

O primeiro item, “Mercado de Call Center: histórico, seus desafios, tendências para futuro” traz um recorte sobre o segmento de Call Center e suas principais

Figura A53 - Produção e consumo de resinas termoplásticas 2000 - 2009 Fonte: Perfil da Indústria de Transformação de Material Plástico - Edição de 2009.. A Figura A54 exibe

Para a análise sobre as práticas de governança de TI para a gestão da tecnologia da informação em instituição hospitalar, foram consideradas as informações

Para minimizar incidentes (acidentais ou não) relacionados à quebra da segurança da informação da empresa, a norma ABNT ISO/IEC 17.779: 2005, apresentada na seção 2.8,