No Description

sorting.py 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. return lista
  79. def shellSort(lista):
  80. #definan el algoritmo de ordenamiento shellsort
  81. #Variable para saber cuando el sort termina
  82. termine = False
  83. #Variable para el tamaño de la lista.
  84. n = len(lista)
  85. #Variable para la mitad del tamaño de la lista.
  86. k = int(n/2)
  87. #Variables para realizar las comparaciones de los elementos.
  88. i = 0
  89. j = k
  90. #Ciclo donde se realiza el ShellSort.
  91. while(termine == False):
  92. #Comparacion de elementos para ver si se puede hacer un swap.
  93. if(lista[i] > lista[j]):
  94. swap(lista, i, j)
  95. #Variables para retener el valor original de x, y para continuar el sort.
  96. tmp1 = i
  97. tmp2 = j
  98. #Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
  99. while True:
  100. #Verificacion para prevenir que se busquen elementos fuera de la lista.
  101. if((i-k) >= 0):
  102. i = i - k
  103. j = j -k
  104. else:
  105. i = tmp1
  106. j = tmp2
  107. break
  108. #Verificacion si se puede hacer otro swap.
  109. if(lista[i] > lista[j]):
  110. swap(lista, i , j)
  111. else:
  112. i = tmp1
  113. j = tmp2
  114. break
  115. #Estos ajustes se utilizan para continuar verificando elementos
  116. #mas adelantes en la lista.
  117. i = i + 1
  118. j = j + 1
  119. else:
  120. #Estos ajustes se utilizan para continuar verificando elementos
  121. #mas adelantes en la lista.
  122. i = i + 1
  123. j = j + 1
  124. #Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
  125. if(j == n):
  126. k = int(k/2)
  127. i = 0
  128. j = k
  129. #Identifica cuando el sort se supone que haya terminado.
  130. if(k == 0):
  131. termine = True
  132. return lista
  133. maxValor=1000 #define el valor maximo de los elementos de la lista
  134. largoLista=1000 #define el largo de las listas a ordenar
  135. veces=100 #define las veces que se va a hacer el ordenamiento
  136. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  137. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  138. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  139. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  140. for i in range(veces):
  141. lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  142. listaMerge = lista[:]
  143. listaHeap = lista[:]
  144. listaQuick = lista[:]
  145. listaShell = lista[:]
  146. t1 = time.process_time() #seteamos el tiempo al empezar
  147. mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort
  148. acumulaMerge+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  149. t1 = time.process_time() #seteamos el tiempo al empezar
  150. heapSort(listaHeap) #ejecutamos el algoritmo heapSort
  151. acumulaHeap+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  152. t1 = time.process_time() #seteamos el tiempo al empezar
  153. quickSort(listaQuick) #ejecutamos el algoritmo quickSort
  154. acumulaQuick+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  155. t1 = time.process_time() #seteamos el tiempo al empezar
  156. shellSort(listaShell) #ejecutamos el algoritmo shellSort
  157. acumulaShell+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  158. #imprimos los resultados
  159. print ("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
  160. print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
  161. print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
  162. print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
  163. print ("ShellSort " + str(acumulaShell/veces) + " segundos")