No Description

sorting.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. La variable veces define las veces que se va a hacer el ordenamiento
  8. Al final se imprimen los promedios de cada algortimo
  9. <<<<<<< HEAD
  10. '''
  11. =======
  12. """
  13. >>>>>>> sortingHeap
  14. import time
  15. from random import randint
  16. import heap
  17. <<<<<<< HEAD
  18. from merge import merge
  19. =======
  20. >>>>>>> sortingHeap
  21. # Python program for implementation of MergeSort
  22. # Merges two subarrays of arr[].
  23. # First subarray is arr[l..m]
  24. # Second subarray is arr[m+1..r]
  25. def mergeSort(lista, l, r):
  26. <<<<<<< HEAD
  27. if l < r:
  28. # Same as (l+r)//2, but avoids overflow for
  29. # large l and h
  30. m = l+(r-l)//2
  31. # Sort first and second halves
  32. mergeSort(lista, l, m)
  33. mergeSort(lista, m+1, r)
  34. merge(lista, l, m, r)
  35. ''' Luis Andrés López Mañán
  36. Program written by hand as a draft on 09/19/2022
  37. Credit goes to GeeksForGeeks
  38. Link: https://www.geeksforgeeks.org/python-program-for-heap-sort/
  39. Last access on 09/19/2022
  40. Program wrriten and edited on 10/10/2022
  41. '''
  42. # Python program for implementation of heap Sort (Part II)
  43. =======
  44. # definan el algoritmo de ordenamiento mergesort
  45. return lista
  46. >>>>>>> sortingHeap
  47. def heapSort(lista):
  48. # Se busca el tamaño de la lista
  49. n = len(lista)
  50. heap.heapify(lista,n,0)
  51. ''' Se crea un heap máximo y el último padre estará en
  52. la posición h1, i.e., la mitad del tamaño de la lista.
  53. Por lo tanto, ese sería el comienzo.
  54. '''
  55. h1 = (n // 2) - 1
  56. for i in range(h1, -1, -1):
  57. heap.heapify(lista, n, i)
  58. <<<<<<< HEAD
  59. # Se extrae los elementos uno a uno
  60. h2 = n - 1
  61. for i in range(h2, 0, -1):
  62. # Se intercambia, luego se hace heapify
  63. lista[i], lista[0] = lista[0], lista[i]
  64. heap.heapify(lista, 0, i)
  65. =======
  66. h2 = n - 1
  67. for i in range(h2, 0, -1):
  68. lista[i], lista[0] = lista[0], lista[i]
  69. heap.heapify(lista, 0, i)
  70. >>>>>>> sortingHeap
  71. return lista
  72. def quickSort(lista):
  73. # definan el algoritmo de ordenamiento quicksort
  74. elements = len(lista)
  75. # Base case
  76. if elements < 2:
  77. return lista
  78. current_position = 0 #Position of the partitioning element
  79. for i in range(1, elements): #Partitioning loop
  80. if lista[i] <= lista[0]:
  81. current_position += 1
  82. temp = lista[i]
  83. lista[i] = lista[current_position]
  84. lista[current_position] = temp
  85. temp = lista[0]
  86. lista[0] = lista[current_position]
  87. lista[current_position] = temp #Brings pivot to it's appropriate position
  88. left = quickSort(lista[0:current_position]) #Sorts the elements to the left of pivot
  89. right = quickSort(lista[current_position+1:elements]) #sorts the elements to the right of pivot
  90. lista = left + [lista[current_position]] + right #Merging everything together
  91. return lista
  92. '''
  93. This algorithm was taken from: https://www.programiz.com/dsa/shell-sort
  94. and was adapted in order to work for this assigment.
  95. '''
  96. def shellSort(lista):
  97. # definan el algoritmo de ordenamiento shellsort
  98. # determening the size of the list and calculates the gap value.
  99. n = len(lista)
  100. gap = n // 2
  101. # this algorithm will run until gap reaches 1
  102. while gap > 0:
  103. for i in range(gap, n):
  104. temp = lista[i] # storing all items from the list into temp
  105. j = i
  106. # compares the number in temp with the 0th possition (start of list)
  107. # if temp is larger than the first element then we swap them
  108. while j >= gap and lista[j - gap] > temp:
  109. lista[j] = lista[j - gap]
  110. j -= gap
  111. lista[j] = temp
  112. gap = gap // 2 # decreases the gap to continue the loop
  113. return lista
  114. maxValor=1000 #define el valor maximo de los elementos de la lista
  115. largoLista=1000 #define el largo de las listas a ordenar
  116. veces=100 #define las veces que se va a hacer el ordenamiento
  117. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  118. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  119. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  120. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  121. for i in range(veces):
  122. mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  123. heaplista=list(mergelista)
  124. quicklista=list(mergelista)
  125. searchlista=list(mergelista)
  126. t1 = time.process_time() #tomamos el tiempo inicial
  127. mergeSort(mergelista,0,len(mergelista)-1) #ejecutamos el algoritmo mergeSort
  128. acumulaMerge+=time.process_time() - t1 #acumulamos el tiempo de ejecucion
  129. # print(mergelista) #desplegamos la lista
  130. t1 = time.process_time() #tomamos el tiempo inicial
  131. heapSort(heaplista) #ejecutamos el algoritmo heapSort
  132. acumulaHeap+=time.process_time() - t1 #acumulamos el tiempo de ejecucion
  133. # print(heaplista) #desplegamos la lista
  134. t1 = time.process_time() #tomamos el tiempo inicial
  135. quickresult = quickSort(quicklista) #ejecutamos el algoritmo quickSort
  136. acumulaQuick+=time.process_time() - t1 #acumulamos el tiempo de ejecucion
  137. # print(quicklista) #desplegamos la lista
  138. t1 = time.process_time() #tomamos el tiempo inicial
  139. shellSort(searchlista) #ejecutamos el algoritmo shellSort
  140. acumulaShell+=time.process_time() - t1 #acumulamos el tiempo de ejecucion
  141. # print(searchlista) #desplegamos la lista
  142. # imprimos los resultados
  143. print ("Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista))
  144. print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
  145. print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
  146. print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
  147. print ("ShellSort " + str(acumulaShell/veces) + " segundos")