説明なし

sorting.py 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. """
  2. Carlos J Corrada Bravo
  3. Este programa calcula el promedio de tiempo de ejecucion 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. from merge import merge
  12. import heapify # Se importa esa librería para usar heapify
  13. '''
  14. Python program for implementation of MergeSort taken from https://www.geeksforgeeks.org/python-program-for-merge-sort/#:~:text=Merge%20Sort%20is%20a%20Divide,assumes%20that%20arr%5Bl..
  15. Merges two subarrays of arr[].
  16. First subarray is arr[l..m]
  17. Second subarray is arr[m+1..r]
  18. '''
  19. def mergeSort(lista, l, r):
  20. if l < r:
  21. # Same as (l+r)//2, but avoids overflow for
  22. # large l and h
  23. m = l + (r - l) // 2
  24. # Sort first and second halves
  25. mergeSort(lista, l, m)
  26. mergeSort(lista, m + 1, r)
  27. merge(lista, l, m, r)
  28. """ Código tomado de GeeksForGeeks.
  29. Enlace electrónico del código
  30. encontrado y adaptado para la
  31. asignación o el proyecto de prác-
  32. tica con git: https://www.geeksforgeeks.org/heap-sort/
  33. """
  34. def heapSort(lista):
  35. #definan el algoritmo de ordenamiento heapsort
  36. heapq.heapify(lista)
  37. # Se busca el tamaño de la lista
  38. n = len(lista)
  39. """ Se crea un heap máximo y el último padre estará en
  40. la posición h1, i.e., la mitad del tamaño de la lista.
  41. Por lo tanto, ese sería el comienzo.
  42. """
  43. h1 = (n // 2) - 1
  44. for i in range(h1, -1, -1):
  45. heapq.heapify(lista[i])
  46. # Se extrae los elementos uno a uno
  47. for i in range(n-1, 0, -1):
  48. # Se intercambia, luego se hace heapify
  49. lista[i], lista[0] = lista[0], lista[i]
  50. heapq.heapify(lista[i])
  51. return lista
  52. def quickSort(lista):
  53. #definan el algoritmo de ordenamiento quicksort
  54. return lista
  55. '''
  56. This algorithm was taken from: https://www.programiz.com/dsa/shell-sort
  57. and was adapted in order to work for this assigment.
  58. '''
  59. def shellSort(lista):
  60. # Determine the list size to find the gap.
  61. n = len(lista)
  62. gap = n // 2
  63. # this algorithm will run until gap reaches 1
  64. while gap > 0:
  65. for i in range(gap, n):
  66. temp = lista[i] # storing all items from lista into temp
  67. j = i
  68. # compares the number in temp with the 0th possition (start of list)
  69. # if temp is larger than the first element then we swap them
  70. while j >= gap and lista[j - gap] > temp:
  71. lista[j] = lista[j - gap]
  72. j -= gap
  73. lista[j] = temp
  74. gap = gap // 2 # decreases the gap to continue the loop
  75. return lista
  76. maxValor = 1000 # define el valor maximo de los elementos de la lista
  77. largoLista = 1000 # define el largo de las listas a ordenar
  78. veces = 100 # define las veces que se va a hacer el ordenamiento
  79. acumulaMerge = 0 # variable para acumular el tiempo de ejecucion del mergesort
  80. acumulaHeap = 0 # variable para acumular el tiempo de ejecucion del heapsort
  81. acumulaQuick = 0 # variable para acumular el tiempo de ejecucion del quicksort
  82. acumulaShell = 0 # variable para acumular el tiempo de ejecucion del shellsort
  83. for i in range(veces):
  84. # creamos una lista con valores al azar
  85. mergelista = [randint(0, maxValor) for r in range(largoLista)]
  86. heaplista = list(mergelista)
  87. quicklista = list(mergelista)
  88. searchlista = list(mergelista)
  89. t1 = time.clock() # seteamos el tiempo al empezar
  90. mergeSort(mergelista) # ejecutamos el algoritmo mergeSort
  91. acumulaMerge += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  92. t1 = time.clock() # seteamos el tiempo al empezar
  93. heapSort(heaplista) # ejecutamos el algoritmo heapSort
  94. acumulaHeap += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  95. t1 = time.clock() # seteamos el tiempo al empezar
  96. quickSort(quicklista) # ejecutamos el algoritmo quickSort
  97. acumulaQuick += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  98. t1 = time.clock() # seteamos el tiempo al empezar
  99. shellSort(searchlista) # ejecutamos el algoritmo shellSort
  100. acumulaShell += time.process_time()-t1 # acumulamos el tiempo de ejecucion
  101. #imprimos los resultados
  102. print ("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
  103. print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
  104. print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
  105. print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
  106. print ("ShellSort " + str(acumulaShell/veces) + " segundos")