No Description

sorting.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 heapq import merge
  10. from lib2to3.pgen2.token import LESS
  11. from random import randint
  12. import time
  13. def mergeSort(lista):
  14. #definan el algoritmo de ordenamiento mergesort
  15. # Carla Ramos Bezares
  16. # Para realizar este codigo lei las explicaciones e implementaciones que ofrecen
  17. # GeeksforGeeks y Progamiz
  18. # check if the array has more than one element
  19. if len(lista) > 1:
  20. # divide the array in two halves
  21. middle = len(lista)//2
  22. leftHalf = lista[:middle]
  23. rightHalf = lista[middle:]
  24. mergeSort(leftHalf)
  25. mergeSort(rightHalf)
  26. # declare pointers
  27. i = j = k = 0
  28. # using our "smaller" arrays, place elements in the correct position of our array
  29. while i < len(leftHalf) and j < len(rightHalf):
  30. if leftHalf[i] < rightHalf[j]:
  31. lista[k] = leftHalf[i]
  32. i = i + 1
  33. else:
  34. lista[k] = rightHalf[j]
  35. j = j + 1
  36. k = k + 1
  37. # continue updating array grabbing any elements that were left
  38. while i < len(leftHalf):
  39. lista[k] = leftHalf[i]
  40. i = i + 1
  41. k = k + 1
  42. while j < len(rightHalf):
  43. lista[k] = rightHalf[j]
  44. j = j + 1
  45. k = k + 1
  46. return lista
  47. def heapSort(lista):
  48. #definan el algoritmo de ordenamiento heapsort
  49. #Andrea V. Nieves
  50. #function def
  51. def heapify(lista, n, i):
  52. biggest = i
  53. left = 2*i + 1
  54. right = 2*i + 2
  55. if left < n and lista[left] > lista[i]:
  56. biggest = left
  57. else:
  58. biggest = i
  59. if right< n and lista[right] > lista[biggest]:
  60. biggest = right
  61. if biggest != i:
  62. lista[i], lista[biggest] = lista[biggest], lista[i]
  63. heapify(lista,n,biggest)
  64. #actual call
  65. n = len(lista)
  66. for i in range(n // 2 - 1, -1, -1):
  67. heapify(lista, n, i)
  68. for i in range(n - 1, 0, -1):
  69. lista[i], lista[0] = lista[0], lista[i]
  70. heapify(lista, i, 0)
  71. return lista
  72. def quickSort(lista):
  73. #definan el algoritmo de ordenamiento quicksort
  74. #Juan F. Hernandez
  75. # Para este codigo se utilizo referencia de stackoverflow
  76. #define arreglos a utilizar
  77. lowerArray = []
  78. equalArray = []
  79. maxArray = []
  80. #organiza los elementos utilizando el pivote para ponerlos en orden
  81. if len(lista) > 1:
  82. pivot = lista[0]
  83. for x in lista:
  84. if x < pivot:
  85. lowerArray.append(x)
  86. elif x == pivot:
  87. equalArray.append(x)
  88. elif x > pivot:
  89. maxArray.append(x)
  90. #concatena arreglos en orden
  91. return quickSort(lowerArray)+equalArray+quickSort(maxArray)
  92. else:
  93. return lista
  94. def shellSort(lista):
  95. #definan el algoritmo de ordenamiento shellsort
  96. #Luis E. Ortiz Cotto
  97. #Este codigo tiene su base de GeeksforGeeks https://www.geeksforgeeks.org/python-program-for-shellsort/
  98. distance = len(lista) / 2 #Coge la distancia que va a haber entre los valores dentro de la lista para ordenar
  99. while distance > 0:
  100. for i in range(distance, len(lista)): #Empieza a ordenar haciendo un insertion sort para la distancia
  101. tmp = lista[i] #Guarda temporeramente el valor que esta en la posicion i que se va a cambiar
  102. j = i #Tiene el valor que va al momento
  103. #Empieza a ordernar los elementos hasta que llegue a la localizacion donde esta el valor temporero
  104. while j >= distance and lista[j - distance] > tmp:
  105. lista[j] = lista[j - distance]
  106. j -= distance
  107. #Pone el valor temporero en su posicion correcta
  108. lista[j] = tmp
  109. distance /= 2 #Coge otra distancia mas entre los valores para ordenarlos otra vez
  110. return lista
  111. maxValor=1000 #define el valor maximo de los elementos de la lista
  112. largoLista=1000 #define el largo de las listas a ordenar
  113. veces=100 #define las veces que se va a hacer el ordenamiento
  114. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  115. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  116. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  117. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  118. for i in range(veces):
  119. mergelista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  120. heaplista=list(mergelista)
  121. quicklista=list(mergelista)
  122. searchlista=list(mergelista)
  123. t1 = time.clock() #seteamos el tiempo al empezar
  124. mergeSort(mergelista) #ejecutamos el algoritmo mergeSort
  125. acumulaMerge+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  126. t1 = time.clock() #seteamos el tiempo al empezar
  127. heapSort(heaplista) #ejecutamos el algoritmo heapSort
  128. acumulaHeap+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  129. t1 = time.clock() #seteamos el tiempo al empezar
  130. quickSort(quicklista) #ejecutamos el algoritmo quickSort
  131. acumulaQuick+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  132. t1 = time.clock() #seteamos el tiempo al empezar
  133. shellSort(searchlista) #ejecutamos el algoritmo shellSort
  134. acumulaShell+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  135. #imprimos los resultados
  136. print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista)
  137. print "MergeSort " + str(acumulaMerge/veces) + " segundos"
  138. print "HeapSort " + str(acumulaHeap/veces) + " segundos"
  139. print "QuickSort " + str(acumulaQuick/veces) + " segundos"
  140. print "ShellSort " + str(acumulaShell/veces) + " segundos"