No Description

sorting.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. import math
  12. def mergeSort(lista):
  13. if (len(lista) == 1):
  14. return lista
  15. n = len(lista)
  16. # Se divide la lista
  17. firstHalf = lista[0:n//2]
  18. secondHalf = lista[n//2:n]
  19. # Se vuelve a llamar para cada mitad
  20. firstHalf = mergeSort(firstHalf)
  21. secondHalf = mergeSort(secondHalf)
  22. # Se unen las listas
  23. lista = merge(firstHalf,secondHalf)
  24. return lista
  25. #Esta es la implementación de Heap sort de Geeksforgeeks
  26. #https://www.geeksforgeeks.org/heap-sort/
  27. def heapSort(lista):
  28. #definan el algoritmo de ordenamiento heapsort
  29. n = len(lista)
  30. #Se hace el maxheap
  31. for i in range(n // 2 - 1, -1, -1):
  32. heapify(lista, n, i)
  33. #Se extraen elementos uno a uno
  34. for i in range(n - 1, 0, -1):
  35. (lista[i], lista[0]) = (lista[0], lista[i])
  36. heapify(lista, i, 0)
  37. return lista
  38. """
  39. Esta implementación de la función partition, relacionada a quicksort fue extraida de geeksforgeeks.org Oct 4, 2022
  40. https://www.geeksforgeeks.org/quick-sort/
  41. """
  42. def partition(lista, low, high):
  43. pivot = lista[high]
  44. i = low - 1
  45. for j in range(low, high):
  46. if lista[j] <= pivot:
  47. i = i + 1
  48. (lista[i], lista[j]) = (lista[j], lista[i])
  49. (lista[i + 1], lista[high]) = (lista[high], lista[i + 1])
  50. return i + 1
  51. """
  52. Esta implementación de quicksort fue extraida de geeksforgeeks.org Oct 4, 2022
  53. https://www.geeksforgeeks.org/quick-sort/
  54. """
  55. def quickSort(lista, low, high):
  56. #definan el algoritmo de ordenamiento quicksort
  57. if low < high:
  58. pi = partition(lista, low, high)
  59. quickSort(lista, low, pi - 1)
  60. quickSort(lista, pi + 1, high)
  61. return lista
  62. def shellSort(lista):
  63. #definan el algoritmo de ordenamiento shellsort
  64. return lista
  65. def heapify(lista, n, i):
  66. largest = i #largest = raíz
  67. l = 2 * i * 1 #left
  68. r = 2 * i + 2 #right
  69. #Ver is existe una rama isquierda y si es mayor a la raíz
  70. if l < n and lista[i] < lista[l]:
  71. largest = l
  72. #Ver is existe una rama derecha y si es mayor a la raíz
  73. if r < n and lista[largest] < lista[r]:
  74. largest = r
  75. #Se cambia la raíz si fuese necesario
  76. if largest != i:
  77. (lista[i], lista[largest]) = (lista[largest], lista[i]) #swap
  78. #Se llama heapify en la raíz nueva
  79. heapify(lista, n, largest)
  80. def merge(firstHalf, secondHalf):
  81. mergeList = []
  82. # Mientras ninguna lista este vacia
  83. while (len(firstHalf) != 0) and (len(secondHalf) != 0):
  84. if firstHalf[0] > secondHalf[0]:
  85. n = secondHalf.pop(0)
  86. mergeList.append(n)
  87. else:
  88. n = firstHalf.pop(0)
  89. mergeList.append(n)
  90. # Si la primera mitad no esta vacia, se anade a la lista merge
  91. while len(firstHalf) != 0:
  92. mergeList.append(firstHalf[0])
  93. firstHalf.pop(0)
  94. # Si la segunda mitad no esta vacia, se anade a la lista merge
  95. while len(secondHalf) != 0:
  96. mergeList.append(secondHalf[0])
  97. secondHalf.pop(0)
  98. return mergeList
  99. maxValor=1000 #define el valor maximo de los elementos de la lista
  100. largoLista=1000 #define el largo de las listas a ordenar
  101. veces=100 #define las veces que se va a hacer el ordenamiento
  102. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  103. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  104. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  105. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  106. for i in range(veces):
  107. mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  108. heaplista=list(mergelista)
  109. quicklista=list(mergelista)
  110. searchlista=list(mergelista)
  111. t1 = time.time() #seteamos el tiempo al empezar
  112. mergeSort(mergelista) #ejecutamos el algoritmo mergeSort
  113. acumulaMerge+=time.time()-t1 #acumulamos el tiempo de ejecucion
  114. t1 = time.time() #seteamos el tiempo al empezar
  115. heapSort(heaplista) #ejecutamos el algoritmo heapSort
  116. acumulaHeap+=time.time()-t1 #acumulamos el tiempo de ejecucion
  117. t1 = time.time() #seteamos el tiempo al empezar
  118. quickSort(quicklista, 0, len(quicklista) - 1) #ejecutamos el algoritmo quickSort
  119. acumulaQuick+=time.time()-t1 #acumulamos el tiempo de ejecucion
  120. t1 = time.time() #seteamos el tiempo al empezar
  121. shellSort(searchlista) #ejecutamos el algoritmo shellSort
  122. acumulaShell+=time.time()-t1 #acumulamos el tiempo de ejecucion
  123. #imprimos los resultados
  124. print("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
  125. print("MergeSort " + str(acumulaMerge/veces) + " segundos")
  126. print("HeapSort " + str(acumulaHeap/veces) + " segundos")
  127. print("QuickSort " + str(acumulaQuick/veces) + " segundos")
  128. print("ShellSort " + str(acumulaShell/veces) + " segundos")