No Description

sorting.py 5.9KB

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