No Description

sorting.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. """
  2. Carlos J Corrada Bravo
  3. Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
  4. La variable maxValor define el valor maximo de los elementos de la lista
  5. La variable largoLista define el largo de las listas a ordenar
  6. La variable veces define las veces que se va a hacer el ordenamiento
  7. Al final se imprimen los promedios de cada algortimo
  8. """
  9. from random import randint
  10. import time
  11. #Defini esta funcion de swap para facilitarme este paso del sort.
  12. #Lo pueden usar si quieren.
  13. def swap(lista, posicion1, posicion2):
  14. tmp = lista[posicion1]
  15. lista[posicion1] = lista[posicion2]
  16. lista[posicion2] = tmp
  17. def mergeSort(lista):
  18. #definan el algoritmo de ordenamiento mergesort
  19. return lista
  20. # Tomada de: https://www.geeksforgeeks.org/heap-sort/
  21. # To heapify subtree rooted at index i.
  22. # n is size of heap
  23. def heapify(arr, n, i):
  24. largest = i # Initialize largest as root
  25. l = 2 * i + 1 # left = 2*i + 1
  26. r = 2 * i + 2 # right = 2*i + 2
  27. # See if left child of root exists and is
  28. # greater than root
  29. if l < n and arr[largest] < arr[l]:
  30. largest = l
  31. # See if right child of root exists and is
  32. # greater than root
  33. if r < n and arr[largest] < arr[r]:
  34. largest = r
  35. # Change root, if needed
  36. if largest != i:
  37. arr[i], arr[largest] = arr[largest], arr[i] # swap
  38. # Heapify the root.
  39. heapify(arr, n, largest)
  40. # Tomada de: https://www.geeksforgeeks.org/heap-sort/
  41. def heapSort(lista):
  42. #definan el algoritmo de ordenamiento heapsort
  43. n = len(lista)
  44. # Build a maxheap.
  45. for i in range(n//2 - 1, -1, -1):
  46. heapify(lista, n, i)
  47. # One by one extract elements
  48. for i in range(n-1, 0, -1):
  49. lista[i], lista[0] = lista[0], lista[i] # swap
  50. heapify(lista, i, 0)
  51. return lista
  52. def quickSort(lista):
  53. #definan el algoritmo de ordenamiento quicksort
  54. return lista
  55. def shellSort(lista):
  56. #definan el algoritmo de ordenamiento shellsort
  57. #Variable para saber cuando el sort termina
  58. termine = False
  59. #Variable para el tamaño de la lista.
  60. n = len(lista)
  61. #Variable para la mitad del tamaño de la lista.
  62. k = int(n/2)
  63. #Variables para realizar las comparaciones de los elementos.
  64. i = 0
  65. j = k
  66. #Ciclo donde se realiza el ShellSort.
  67. while(termine == False):
  68. #Comparacion de elementos para ver si se puede hacer un swap.
  69. if(lista[i] > lista[j]):
  70. swap(lista, i, j)
  71. #Variables para retener el valor original de x, y para continuar el sort.
  72. tmp1 = i
  73. tmp2 = j
  74. #Ciclo para realizar swaps en elementos anteriores luego de encontrar un swap.
  75. while True:
  76. #Verificacion para prevenir que se busquen elementos fuera de la lista.
  77. if((i-k) >= 0):
  78. i = i - k
  79. j = j -k
  80. else:
  81. i = tmp1
  82. j = tmp2
  83. break
  84. #Verificacion si se puede hacer otro swap.
  85. if(lista[i] > lista[j]):
  86. swap(lista, i , j)
  87. else:
  88. i = tmp1
  89. j = tmp2
  90. break
  91. #Estos ajustes se utilizan para continuar verificando elementos
  92. #mas adelantes en la lista.
  93. i = i + 1
  94. j = j + 1
  95. else:
  96. #Estos ajustes se utilizan para continuar verificando elementos
  97. #mas adelantes en la lista.
  98. i = i + 1
  99. j = j + 1
  100. #Verifica antes de salirse de la lista para poder comenzar otra vuelta con k/2.
  101. if(j == n):
  102. k = int(k/2)
  103. i = 0
  104. j = k
  105. #Identifica cuando el sort se supone que haya terminado.
  106. if(k == 0):
  107. termine = True
  108. return lista
  109. maxValor=1000 #define el valor maximo de los elementos de la lista
  110. largoLista=1000 #define el largo de las listas a ordenar
  111. veces=100 #define las veces que se va a hacer el ordenamiento
  112. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  113. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  114. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  115. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  116. for i in range(veces):
  117. lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  118. listaMerge = lista[:]
  119. listaHeap = lista[:]
  120. listaQuick = lista[:]
  121. listaShell = lista[:]
  122. t1 = time.process_time() #seteamos el tiempo al empezar
  123. mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort
  124. acumulaMerge+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  125. t1 = time.process_time() #seteamos el tiempo al empezar
  126. heapSort(listaHeap) #ejecutamos el algoritmo heapSort
  127. acumulaHeap+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  128. t1 = time.process_time() #seteamos el tiempo al empezar
  129. quickSort(listaQuick) #ejecutamos el algoritmo quickSort
  130. acumulaQuick+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  131. t1 = time.process_time() #seteamos el tiempo al empezar
  132. shellSort(listaShell) #ejecutamos el algoritmo shellSort
  133. acumulaShell+=time.process_time()-t1 #acumulamos el tiempo de ejecucion
  134. #imprimos los resultados
  135. print ("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
  136. print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
  137. print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
  138. print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
  139. print ("ShellSort " + str(acumulaShell/veces) + " segundos")