Brak opisu

sorting.py 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. '''
  13. 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..
  14. Merges two subarrays of arr[].
  15. First subarray is arr[l..m]
  16. Second subarray is arr[m+1..r]
  17. '''
  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. def heapSort(lista):
  28. # definan el algoritmo de ordenamiento heapsort
  29. return lista
  30. def quickSort(lista):
  31. # definan el algoritmo de ordenamiento quicksort
  32. return lista
  33. '''
  34. This algorithm was taken from: https://www.programiz.com/dsa/shell-sort
  35. and was adapted in order to work for this assigment.
  36. '''
  37. def shellSort(lista):
  38. # Determine the list size to find the gap.
  39. n = len(lista)
  40. gap = n // 2
  41. # this algorithm will run until gap reaches 1
  42. while gap > 0:
  43. for i in range(gap, n):
  44. temp = lista[i] # storing all items from lista into temp
  45. j = i
  46. # compares the number in temp with the 0th possition (start of list)
  47. # if temp is larger than the first element then we swap them
  48. while j >= gap and lista[j - gap] > temp:
  49. lista[j] = lista[j - gap]
  50. j -= gap
  51. lista[j] = temp
  52. gap = gap // 2 # decreases the gap to continue the loop
  53. return lista
  54. maxValor = 1000 # define el valor maximo de los elementos de la lista
  55. largoLista = 1000 # define el largo de las listas a ordenar
  56. veces = 100 # define las veces que se va a hacer el ordenamiento
  57. acumulaMerge = 0 # variable para acumular el tiempo de ejecucion del mergesort
  58. acumulaHeap = 0 # variable para acumular el tiempo de ejecucion del heapsort
  59. acumulaQuick = 0 # variable para acumular el tiempo de ejecucion del quicksort
  60. acumulaShell = 0 # variable para acumular el tiempo de ejecucion del shellsort
  61. for i in range(veces):
  62. mergelista = [randint(0, maxValor) for r in range(largoLista)] # creamos una lista con valores al azar
  63. heaplista = list(mergelista)
  64. quicklista = list(mergelista)
  65. searchlista = list(mergelista)
  66. t1 = time.process_time() # tomamos el tiempo inicial
  67. mergeSort(mergelista, 0, len(mergelista) - 1) # ejecutamos el algoritmo mergeSort
  68. acumulaMerge += time.process_time() - t1 # acumulamos el tiempo de ejecucion
  69. print(mergelista) # desplegamos la lista
  70. t1 = time.process_time() # tomamos el tiempo inicial
  71. heapSort(heaplista) # ejecutamos el algoritmo heapSort
  72. acumulaHeap += time.process_time() - t1 # acumulamos el tiempo de ejecucion
  73. # print(heaplista) #desplegamos la lista
  74. t1 = time.process_time() # tomamos el tiempo inicial
  75. quickSort(quicklista) # ejecutamos el algoritmo quickSort
  76. acumulaQuick += time.process_time() - t1 # acumulamos el tiempo de ejecucion
  77. # print(quicklista) #desplegamos la lista
  78. t1 = time.process_time() # tomamos el tiempo inicial
  79. shellSort(searchlista) # ejecutamos el algoritmo shellSort
  80. acumulaShell += time.process_time() - t1 # acumulamos el tiempo de ejecucion
  81. print(searchlista) # desplegamos la lista
  82. # imprimos los resultados
  83. print("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
  84. print("MergeSort " + str(acumulaMerge / veces) + " segundos")
  85. print("HeapSort " + str(acumulaHeap / veces) + " segundos")
  86. print("QuickSort " + str(acumulaQuick / veces) + " segundos")
  87. print("ShellSort " + str(acumulaShell / veces) + " segundos")