13
19/05/2015 1 COMPANY LOGO Algoritmos de Ordenación Contenido J. C. Carbajal L. Merge sort 1 Análisis Merge sort 2 Quick sort 3 Análisis QuickSort 4 D.A.I. A l g o r i t m i c a I I I Tarea QuickSort 5 COMPANY LOGO Ejemplo: Merge sort J. C. Carbajal L. D.A.I. A l g o r i t m i c a I I I 43 15 9 1 22 26 19 55 37 43 99 2 18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2 18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2 18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2 18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2 18 26 32 6 COMPANY LOGO Ejemplo: Merge sort J. C. Carbajal L. D.A.I. A l g o r i t m i c a I I I 18 26 32 6 43 15 9 1 18 26 32 6 43 15 9 1 18 26 32 6 43 15 9 1 26 18 6 32 15 43 1 9 18 26 32 6 43 15 9 1 18 26 32 6 43 15 9 1 18 26 32 6 15 43 1 9 6 18 26 32 1 9 15 43 1 6 9 15 18 26 32 43 18 26 18 26 18 26 32 32 6 6 32 6 18 26 32 6 43 43 15 15 43 15 9 9 1 1 9 1 43 15 9 1 18 26 32 6 43 15 9 1 18 26 6 32 6 26 32 18 15 43 1 9 1 9 15 43 1 6 9 15 18 26 32 43 Secuencia original Secuencia ordenada COMPANY LOGO Merge sort MergeSort( list, first, last ) list la lista de elementos que se pondrán en orden first el índice del primer elemento de la parte de la lista a ordenar last el índice del último elemento de la parte de la lista a ordenar if first < last then middle = ( first + last ) / 2 MergeSort( list, first, middle ) MergeSort( list, middle + 1, last ) MergeLists( list, first, middle, middle + 1, last ) end if J. C. Carbajal L. D.A.I. A l g o r i t m i c a I I I COMPANY LOGO MergeLists MergeLists( list, start1, end1, start2, end2 ) list los elementos que se pondrán en orden start1 inicio de la lista A end1 final de la lista A start2 inicio de la lista B end2 final de la lista B J. C. Carbajal L. D.A.I. A l g o r i t m i c a I I I COMPANY LOGO MergeLists // asume que los elementos de A y B son contiguos en la lista finalStart = start1 finalEnd = end2 indexC = 1 while (start1 end1) and (start2 end2) do if list[start1] < list[start2] then result[indexC] = list[start1] start1 = start1 + 1 else result[indexC] = list[start2] start2 = start2 + 1 end if indexC = indexC + 1 end while J. C. Carbajal L. D.A.I. A l g o r i t m i c a I I I

AlgMerge QuickSort AlgIII

Embed Size (px)

DESCRIPTION

algoritmo de ordenamiento merger y quick

Citation preview

Page 1: AlgMerge QuickSort AlgIII

19/05/2015

1

COMPANYLOGOAlgoritmos de Ordenación

₪Contenido

J. C. Carbajal L.

Merge sort1

Análisis Merge sort2

Quick sort3

Análisis QuickSort4

D.A.I. A l g o r i t m i c a I I I

Tarea QuickSort5

COMPANYLOGOEjemplo: Merge sort

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

43 15 9 1 22 26 19 55 37 43 99 2

18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2

18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2

18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2

18 26 32 6 43 15 9 1 22 26 19 55 37 43 99 2

18 26 32 6

COMPANYLOGOEjemplo: Merge sort

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

18 26 32 6 43 15 9 1

18 26 32 6 43 15 9 1

18 26 32 6 43 15 9 1

2618 6 32 1543 1 9

18 26 32 6 43 15 9 1

18 26 32 6 43 15 9 1

18 26 326 15 43 1 9

6 18 26 32 1 9 15 43

1 6 9 15 18 26 32 43

18 26

18 26

18 26

32

32

6

6

32 6

18 26 32 6

43

43

15

15

43 15

9

9

1

1

9 1

43 15 9 1

18 26 32 6 43 15 9 1

18 26 6 32

6 26 3218

1543 1 9

1 9 15 43

1 6 9 1518 26 32 43

Secuencia original Secuencia ordenada

COMPANYLOGOMerge sort

MergeSort( list, first, last )

list la lista de elementos que se pondrán en orden

first el índice del primer elemento de la parte de la lista a ordenar

last el índice del último elemento de la parte de la lista a ordenar

if first < last then

middle = ( first + last ) / 2

MergeSort( list, first, middle )

MergeSort( list, middle + 1, last )

MergeLists( list, first, middle, middle + 1, last )

end if

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOMergeLists

MergeLists( list, start1, end1, start2, end2 )

list los elementos que se pondrán en orden

start1 inicio de la lista A

end1 final de la lista A

start2 inicio de la lista B

end2 final de la lista B

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOMergeLists

// asume que los elementos de A y B son contiguos en la lista

finalStart = start1finalEnd = end2indexC = 1while (start1 ≤ end1) and (start2 ≤ end2) do

if list[start1] < list[start2] thenresult[indexC] = list[start1]start1 = start1 + 1

elseresult[indexC] = list[start2]start2 = start2 + 1

end ifindexC = indexC + 1

end while

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

Page 2: AlgMerge QuickSort AlgIII

19/05/2015

2

COMPANYLOGOMergeLists

// mover la parte de la lista que queda

if (start1 ≤ end1) then

for i = start1 to end1 do

result[indexC] = list[i]

indexC = indexC + 1

end for

else

for i = start2 to end2 do

result[indexC] = list[i]

indexC = indexC + 1

end for

end ifJ. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOMergeLists

MergeSort( list, first, last )

list la lista de elementos a ordenar

first el índice del primer elemento de la parte de la lista a ordenar

last el índice del último elemento de la parte de la lista a ordenar

if first < last then

middle = ( first + last ) / 2

MergeSort( list, first, middle )

MergeSort( list, middle + 1, last )

MergeLists( list, first, middle, middle + 1, last )

end if

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

14 23 45 98 6 33 42 67

ú ú

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

23 45 98 33 42 6714 6

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

23 45 98 6 42 67

6

14 33

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 45 98 6 42 67

6 14

23 33

Page 3: AlgMerge QuickSort AlgIII

19/05/2015

3

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 98 6 42 67

6 14 23

45 33

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 98 6 33 67

6 14 23 33

45 42

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 98 6 33 42

6 14 23 33 42

45 67

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 45 6 33 42

6 14 23 33 42 45

98 67

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 45 98 6 33 42 67

6 14 23 33 42 45 67

COMPANYLOGOAnálisis de MergeLists

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

MergeLists

14 23 45 98 6 33 42 67

6 14 23 33 42 45 67 98

Debido a que las comparaciones resultaron en movimiento todos menos el último elemento de A, habremos hecho + − comparaciones en este caso más desfavorable.

Page 4: AlgMerge QuickSort AlgIII

19/05/2015

4

COMPANYLOGOAnálisis de Merge sort

Basándose en el análisis de MergeLists, estosignifica que en la etapa de combinar se llevará a�/ comparaciones en el mejor de los casos, y�/ + �/ − , o � − comparaciones en el peorcaso. Poniendo todo esto junto da las dosrelaciones de recurrencia para el mejor de loscasos (B) y el peor de los casos (W).� � = � � + � −� = � =� = � + �= =

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOAnálisis de Merge sort

Resolver las ecuaciones de recurrencia. Primeroresolveremos para el peor caso� � = � � + � −� � = � � 8 + � −� � 8 = � � 6 + � 8 −� � 6 = � � + � 6 −Ahora sustituimos:� � = � � + � −� � = � � + � − + � −� � = � + � − + � −� � = � � 8 + � − + � − + � −� � = 8 � 8 + � − + � − + � −

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOAnálisis de Merge sort� � = 8 � 8 + � − +� − +� −� �= 8 � � 6 + � 8− + � − 8+ � − +� − +� −� � = 6� � 6 + � − 8 + � − +� − +� −� �= 6 � � + � 6 − + � − 8 +� − +� − +�−� �= � � +� − 6+ � − 8 +� − +� − +� −� � = � � 5� � log � = � � �

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOAnálisis de Merge sort� � = � � 5� � log � = � � �

� � = � ∗� +� log� − �=log �− �� � = � log� − log � −� � = � log� − � +Esto significa que� � = � log�Cuando nos fijamos en � � y � , vemos la diferenciaentre los dos es que � se convierte en �/ . Cuando nosfijamos en el papel que � jugó durante nuestrassustituciones, el lector debe ver que � ≈ � log� / ,por lo que también es el caso de que � = � � log� .

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort

Dado un vector de n elementos (por ejemplo,números enteros):

Si el array sólo contiene un elemento, regresar

Sino

Elegir un elemento a utilizar como pivote.

Elementos separados en dos sub-arreglos:

Elementos menores que o iguales al pivote

Elementos mayores que el pivote

QuickSort dos sub-arreglos

Retorno de resultados

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOEjemplo

Se nos da conjunto de n números enteros paraordenar:

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100

Page 5: AlgMerge QuickSort AlgIII

19/05/2015

5

COMPANYLOGOEscoger el pivote

Hay un número de maneras de escoger el elementopivote. En este ejemplo, vamos a utilizar el primerelemento de la matriz:

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100

COMPANYLOGOParticionar el arreglo

Dado un pivote, particionar los elementos delarreglo de tal manera que el arreglo resultanteconsta de:

Un sub-arreglo que contiene elementos > = pivote

Otro sub-arreglo que contiene los elementos < pivote

Los sub-arrays se almacenan en la matriz de datosoriginal.

Particiones recorre, intercambiando elementos queestán por debajo / encima del pivote.

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]++too_big_index

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]++too_big_index

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]++too_big_index

Page 6: AlgMerge QuickSort AlgIII

19/05/2015

6

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 80 60 50 7 30 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

Page 7: AlgMerge QuickSort AlgIII

19/05/2015

7

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 60 50 7 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

Page 8: AlgMerge QuickSort AlgIII

19/05/2015

8

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

Page 9: AlgMerge QuickSort AlgIII

19/05/2015

9

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

40 20 10 30 7 50 60 80 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

COMPANYLOGOejemplo

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

7 20 10 30 40 50 60 80 100

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

pivot_index = 4

COMPANYLOGOResultado de la partición

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

7 20 10 30 40 50 60 80 100

[0] [1] [2] [3] [4] [5] [6] [7] [8]

<= data[pivot] > data[pivot]

Page 10: AlgMerge QuickSort AlgIII

19/05/2015

10

COMPANYLOGOQuicksort: sub-arreglos

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

7 20 10 30 40 50 60 80 100

[0] [1] [2] [3] [4] [5] [6] [7] [8]

<= data[pivot] > data[pivot]

COMPANYLOGOAnálisis de Quicksort

Suponga que las claves son aleatorias,distribuidas uniformemente.

¿Cuál es el mejor tiempo para sufuncionamiento?

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort : mejor caso

Suponga que las claves son aleatorias,distribuidas uniformemente.

¿Cuál es el mejor tiempo para sufuncionamiento?

La recursividad:

1. Partición divide arreglo en dos sub-arreglos de tamaño/2. Quicksort a cada sub-arreglo

¿Profundidad del árbol de recursión?� log ¿Número de accesos en la partición?�

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort : mejor caso

Suponga que las claves son aleatorias, distribuidasuniformemente.

Mejor de los casos el tiempo de funcionamiento:� log

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort: mejor caso

Suponga que las claves son aleatorias, distribuidasuniformemente.

Tiempo de funcionamiento en el mejor de los casos:� log¿Tiempo de funcionamiento en el peor de loscasos?

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort: Peor caso

Supongamos que el primer elemento se elige comopivote.

Supongamos que obtenemos un arreglo que ya estáen orden:

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

Page 11: AlgMerge QuickSort AlgIII

19/05/2015

11

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

Page 12: AlgMerge QuickSort AlgIII

19/05/2015

12

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

too_big_index too_small_index

COMPANYLOGOQuicksort: Peor caso

1.While data[too_big_index] <= data[pivot]

++too_big_index

2.While data[too_small_index] > data[pivot]

--too_small_index

3.If too_big_index < too_small_index

swap data[too_big_index] and data[too_small_index]

4.While too_small_index > too_big_index, go to 1.

5.Swap data[too_small_index] and data[pivot_index]

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

2 4 10 12 13 50 57 63 100pivot_index = 0

[0] [1] [2] [3] [4] [5] [6] [7] [8]

> data[pivot]<= data[pivot]

COMPANYLOGOQuicksort : peor caso

Suponga que las claves son aleatorias, distribuidasuniformemente.

Tiempo de funcionamiento mejor caso: � log ¿Tiempo funcionamiento para el peor caso?

La recursividad:1. La partición divide el arreglo en dos sub-arreglos:

un sub-arreglo de tamaño 0

otro sub-arreglo de tamaño n-1

2. Quicksort a cada sub-arreglo

¿Profundidad del árbol de recursión?� ¿Número de accesos en la partición?�

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort : peor caso

Suponga que las claves son aleatorias,distribuidas uniformemente.

Tiempo de funcionamiento mejor caso:� log Tiempo funcionamiento para el peor caso�

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort : peor caso

Suponga que las claves son aleatorias,distribuidas uniformemente.

Tiempo de funcionamiento mejor caso:� log Tiempo funcionamiento para el peor caso�¿Qué podemos hacer para evitar el peorde los casos?

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOMejorar la elección pivote

Escoger el valor medio de tres elementos delarreglo de datos:

datos [0], datos [n / 2], y los datos [n-1].

Utilice este valor medio como pivote.

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

Page 13: AlgMerge QuickSort AlgIII

19/05/2015

13

COMPANYLOGO

Mejorar el rendimiento de Quicksort

Mejor la elección del pivote.

Para sub-arrays de tamaño 3 o menos, aplicar labúsqueda de fuerza bruta:

Sub-arreglo de tamaño 1: trivial

Sub-arreglo de tamaño 2:

if(data[first] > data[second]) intercambiarlos

Sub-arreglo de tamaño 3: se deja comotarea.

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOTarea: Quicksort

Quicksort( list, first, last )

list elementos que se pondrán en orden

first índice del primer elemento en la parte de la lista a ordenar

last índice del último elemento en la parte de la lista a ordenar

if first < last then

pivot = PivotList( list, first, last )

Quicksort( list, first, pivot-1 )

Quicksort( list, pivot+1, last )

end if

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOTarea: Quicksort

PivotList( list, first, last )list los elementos para trabajarfirst el índice del primer elementolast el índice del último elementoPivotValue = list[ first ]PivotPoint = firstfor index = first + 1 to last do

if list[ index ] < PivotValue thenPivotPoint = PivotPoint + 1Swap( list[ PivotPoint ], list[ index ] )

end ifend for// mover el valor del pivote a su lugar correctoSwap( list[ first ], list[ PivotPoint ] )return PivotPoint

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

COMPANYLOGOQuicksort

J. C. Carbajal L.D.A.I. A l g o r i t m i c a I I I

Tarea: realizar el análisis del caso promedio para el quicksort