Ei kuvausta

sorting.py 5.4KB

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