Keine Beschreibung

sorting.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # -*- coding: utf-8 -*-
  2. """
  3. Carlos J Corrada Bravo
  4. Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
  5. La variable maxValor define el valor maximo de los elementos de la lista
  6. La variable largoLista define el largo de las listas a ordenar
  7. La variable veces define las veces que se va a hacer el ordenamiento
  8. Al final se imprimen los promedios de cada algortimo
  9. """
  10. from random import randint
  11. import time
  12. def isSorted(lista):
  13. return lista == sorted(lista)
  14. def mergeSort(lista):
  15. #definan el algoritmo de ordenamiento mergesort
  16. return lista
  17. """La siguiente implementación del algoritmo 'Heapsort'
  18. fue implementada por Miguel E. Cruz Molina, siguiendo
  19. el diseño propuesto en el libro 'Introduction to
  20. Algorithms' (2009, 3rd ed.), de Cormen, T. H. et al."""
  21. def heapSort(lista):
  22. """Esta función toma una lista de números y los ordena
  23. usando el algoritmo 'heapsort', que repetitivamente
  24. convierte a los elementos no-ordenados en un montículo
  25. maximal y sustituye el elemento mayor por el último."""
  26. # El algoritmo primero genera un montículo maximal
  27. # con los elementos en la lista:
  28. buildHeap(lista, len(lista) - 1)
  29. # Por cada uno de los elementos en la lista,
  30. for i in range(len(lista) - 1, 0, -1):
  31. # Se sustituye el elemento en la raíz del montículo
  32. # (el elemento más grande) con el último,
  33. print(lista)
  34. temp = lista[i]
  35. lista[i] = lista[0]
  36. lista[0] = temp
  37. print(lista)
  38. # Y se genera un montículo con los elementos
  39. # restantes, hasta terminar con la lista ordenada.
  40. buildHeap(lista, i)
  41. return lista
  42. def buildHeap(lista, heapsize):
  43. """Esta función toma a una lista de números y la
  44. convierte en una representación lineal de un montículo
  45. maximal, i.e. un árbol binario en el que el contenido
  46. de todo nodo padre (de índice k) es mayor al de sus
  47. hijos (de índices 2k + 1 y 2k + 2). Este proceso se
  48. realiza recursivamente, desde el penúltimo 'nivel'
  49. del árbol hasta la raíz, usando la función auxiliar
  50. 'maxHeapify()'. """
  51. for i in range((heapsize-1)//2, -1, -1):
  52. maxHeapify(lista, i, heapsize)
  53. def maxHeapify(lista, k, heapsize):
  54. """Esta función tiene como propósito garantizar que
  55. la propiedad maximal de un montículo se conserve,
  56. intercambiando el valor de un nodo padre por el mayor
  57. valor de entre sus nodos hijos de ser necesario, y
  58. aplicando el mismo algoritmo sobre el subárbol de ese
  59. hijo de forma recursiva. La función recibe tres
  60. argumentos: la lista que contiene el montículo,
  61. el índice de la raíz del montículo a considerarse,
  62. y el límite del montículo mayor, que no necesariamente
  63. es equivalente al largo de la lista."""
  64. # Primero se identifican los índices hipotéticos
  65. # de los nodos hijos:
  66. l = 2 * k + 1; r = 2 * k + 2; max = k
  67. # Identificar cuál de los tres nodos tiene el mayor
  68. # valor.
  69. if l < heapsize and lista[max] < lista[l]: max = l
  70. if r < heapsize and lista[max] < lista[r]: max = r
  71. # Si el nodo padre no es el mayor, intercambiarlo
  72. # por el nodo hijo con mayor valor, y llamar la
  73. # función de modo recursivo sobre el subárbol de
  74. # ese hijo.
  75. if max != k:
  76. temp = lista[k]
  77. lista[k] = lista[max]
  78. lista[max] = temp
  79. maxHeapify(lista, max, heapsize)
  80. def quickSort(lista):
  81. #definan el algoritmo de ordenamiento quicksort
  82. return lista
  83. def insertionSort(lista):
  84. i = 1
  85. while i < len(lista):
  86. if lista[i - 1] > lista[i]:
  87. j = i - 1
  88. while j >= 0 and lista[j] > lista[j + 1]:
  89. lista[j], lista[j + 1] = lista[j + 1], lista[j]
  90. j -= 1
  91. i += 1
  92. return lista
  93. def shellSort(lista):
  94. gap = len(lista) / 2
  95. while gap >= 1:
  96. i = gap
  97. while i < len(lista):
  98. if lista[i - gap] > lista[i]:
  99. j = i - gap
  100. while j >= 0 and lista[j] > lista[j + gap]:
  101. lista[j], lista[j + gap] = lista[j + gap], lista[j]
  102. j -= gap
  103. i += gap
  104. gap /= 2
  105. #if isSorted(lista):
  106. #print "Lista is sorted"
  107. #else:
  108. #print "Lista is not sorted"
  109. return lista
  110. maxValor=1000 #define el valor maximo de los elementos de la lista
  111. largoLista=1000 #define el largo de las listas a ordenar
  112. veces=100 #define las veces que se va a hacer el ordenamiento
  113. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  114. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  115. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  116. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  117. for i in range(veces):
  118. lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  119. # creamos copias de la lista para cada algoritmo
  120. listaMerge = lista[:]
  121. listaHeap = lista[:]
  122. listaQuick = lista[:]
  123. listaShell = lista[:]
  124. t1 = time.clock() #seteamos el tiempo al empezar
  125. mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort
  126. acumulaMerge+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  127. t1 = time.clock() #seteamos el tiempo al empezar
  128. heapSort(listaHeap) #ejecutamos el algoritmo heapSort
  129. acumulaHeap+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  130. t1 = time.clock() #seteamos el tiempo al empezar
  131. quickSort(listaQuick) #ejecutamos el algoritmo quickSort
  132. acumulaQuick+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  133. t1 = time.clock() #seteamos el tiempo al empezar
  134. shellSort(listaShell) #ejecutamos el algoritmo shellSort
  135. acumulaShell+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  136. #imprimos los resultados
  137. print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista)
  138. print "MergeSort " + str(acumulaMerge/veces) + " segundos"
  139. print "HeapSort " + str(acumulaHeap/veces) + " segundos"
  140. print "QuickSort " + str(acumulaQuick/veces) + " segundos"
  141. print "ShellSort " + str(acumulaShell/veces) + " segundos"