No Description

sorting.py 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. # Defini esta funcion de swap para facilitarme este paso del sort.
  13. # Lo pueden usar si quieren.
  14. def swap(lista, posicion1, posicion2):
  15. tmp = lista[posicion1]
  16. lista[posicion1] = lista[posicion2]
  17. lista[posicion2] = tmp
  18. def mergeSort(lista):
  19. # definan el algoritmo de ordenamiento mergesort
  20. if len(lista) > 1:
  21. mid = len(lista)//2
  22. left = lista[:mid]
  23. right = lista[mid:]
  24. mergeSort(left)
  25. mergeSort(right)
  26. i = j = k = 0
  27. while i < len(left) and j < len(right):
  28. if left[i] < right[j]:
  29. lista[k] = left[i]
  30. i += 1
  31. else:
  32. lista[k] = right[j]
  33. j += 1
  34. k += 1
  35. while i < len(left):
  36. lista[k] = left[i]
  37. i += 1
  38. k += 1
  39. while j < len(right):
  40. lista[k] = right[j]
  41. j += 1
  42. k += 1
  43. return lista
  44. # Tomada de: https://www.geeksforgeeks.org/heap-sort/
  45. # To heapify subtree rooted at index i.
  46. # n is size of heap
  47. def heapify(arr, n, i):
  48. largest = i # Initialize largest as root
  49. l = 2 * i + 1 # left = 2*i + 1
  50. r = 2 * i + 2 # right = 2*i + 2
  51. # See if left child of root exists and is
  52. # greater than root
  53. if l < n and arr[largest] < arr[l]:
  54. largest = l
  55. # See if right child of root exists and is
  56. # greater than root
  57. if r < n and arr[largest] < arr[r]:
  58. largest = r
  59. # Change root, if needed
  60. if largest != i:
  61. arr[i], arr[largest] = arr[largest], arr[i] # swap
  62. # Heapify the root.
  63. heapify(arr, n, largest)
  64. # Tomada de: https://www.geeksforgeeks.org/heap-sort/
  65. def heapSort(lista):
  66. # definan el algoritmo de ordenamiento heapsort
  67. n = len(lista)
  68. # Build a maxheap.
  69. for i in range(n//2 - 1, -1, -1):
  70. heapify(lista, n, i)
  71. # One by one extract elements
  72. for i in range(n-1, 0, -1):
  73. lista[i], lista[0] = lista[0], lista[i] # swap
  74. heapify(lista, i, 0)
  75. return lista
  76. def quickSort(lista):
  77. # definan el algoritmo de ordenamiento quicksort
  78. # If lista is empty or has only one element.
  79. if len(lista) <= 1:
  80. return lista
  81. # Else, set pivot to a random element of the list.
  82. else:
  83. pivot = lista[randint(0, len(lista)-1)]
  84. # Create three list for the numbers lesser, equal and greater than the pivot.
  85. lesser = []
  86. equal = []
  87. greater = []
  88. # Iterate through the list and add the elements to the respective list.
  89. for i in lista:
  90. if i < pivot:
  91. lesser.append(i)
  92. elif i > pivot:
  93. greater.append(i)
  94. else:
  95. equal.append(i)
  96. # Recursively call quickSort on the two lists and concatenate them with the equal list.
  97. return quickSort(lesser) + equal + quickSort(greater)
  98. def shellSort(lista):
  99. # definan el algoritmo de ordenamiento shellsort
  100. # Variable para saber cuando el sort termina
  101. termine = False
  102. # Variable para el tamaño de la lista.
  103. n = len(lista)
  104. # Variable para la mitad del tamaño de la lista.
  105. k = int(n/2)
  106. # Variables para realizar las comparaciones de los elementos.
  107. i = 0
  108. j = k
  109. # Ciclo donde se realiza el ShellSort.
  110. while(termine == False):
  111. # Comparacion de elementos para ver si se puede hacer un swap.
  112. if(lista[i] > lista[j]):
  113. swap(lista, i, j)
  114. # Variables para retener el valor original de x, y para continuar el sort.
  115. tmp1 = i
  116. tmp2 = j
  117. # Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
  118. while True:
  119. # Verificacion para prevenir que se busquen elementos fuera de la lista.
  120. if((i-k) >= 0):
  121. i = i - k
  122. j = j - k
  123. else:
  124. i = tmp1
  125. j = tmp2
  126. break
  127. # Verificacion si se puede hacer otro swap.
  128. if(lista[i] > lista[j]):
  129. swap(lista, i, j)
  130. else:
  131. i = tmp1
  132. j = tmp2
  133. break
  134. # Estos ajustes se utilizan para continuar verificando elementos
  135. # mas adelantes en la lista.
  136. i = i + 1
  137. j = j + 1
  138. else:
  139. # Estos ajustes se utilizan para continuar verificando elementos
  140. # mas adelantes en la lista.
  141. i = i + 1
  142. j = j + 1
  143. # Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
  144. if(j == n):
  145. k = int(k/2)
  146. i = 0
  147. j = k
  148. # Identifica cuando el sort se supone que haya terminado.
  149. if(k == 0):
  150. termine = True
  151. return lista
  152. maxValor = 1000 # define el valor maximo de los elementos de la lista
  153. largoLista = 1000 # define el largo de las listas a ordenar
  154. veces = 100 # define las veces que se va a hacer el ordenamiento
  155. acumulaMerge = 0 # variable para acumular el tiempo de ejecucion del mergesort
  156. acumulaHeap = 0 # variable para acumular el tiempo de ejecucion del heapsort
  157. acumulaQuick = 0 # variable para acumular el tiempo de ejecucion del quicksort
  158. acumulaShell = 0 # variable para acumular el tiempo de ejecucion del shellsort
  159. for i in range(veces):
  160. # creamos una lista con valores al azar
  161. lista = [randint(0, maxValor) for r in range(largoLista)]
  162. listaMerge = lista[:]
  163. listaHeap = lista[:]
  164. listaQuick = lista[:]
  165. listaShell = lista[:]
  166. t1 = time.process_time() # seteamos el tiempo al empezar
  167. mergeSort(listaMerge) # ejecutamos el algoritmo mergeSort
  168. acumulaMerge += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  169. t1 = time.process_time() # seteamos el tiempo al empezar
  170. heapSort(listaHeap) # ejecutamos el algoritmo heapSort
  171. acumulaHeap += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  172. t1 = time.process_time() # seteamos el tiempo al empezar
  173. quickSort(listaQuick) # ejecutamos el algoritmo quickSort
  174. acumulaQuick += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  175. t1 = time.process_time() # seteamos el tiempo al empezar
  176. shellSort(listaShell) # ejecutamos el algoritmo shellSort
  177. acumulaShell += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  178. # imprimos los resultados
  179. print("Promedio de tiempo de ejecucion de " +
  180. str(veces) + " listas de largo " + str(largoLista))
  181. print("MergeSort " + str(acumulaMerge/veces) + " segundos")
  182. print("HeapSort " + str(acumulaHeap/veces) + " segundos")
  183. print("QuickSort " + str(acumulaQuick/veces) + " segundos")
  184. print("ShellSort " + str(acumulaShell/veces) + " segundos")