No Description

sorting.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #coding=utf-8
  2. """
  3. Programadores:
  4. Carlos J Corrada Bravo
  5. Diego Rodríguez
  6. Joel González
  7. Javier Santiago
  8. Luis Jusino
  9. """
  10. """
  11. Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
  12. La variable maxValor define el valor maximo de los elementos de la lista
  13. La variable largoLista define el largo de las listas a ordenar
  14. La variable veces define las veces que se va a hacer el ordenamiento
  15. Al final se imprimen los promedios de cada algortimo
  16. """
  17. from random import randint
  18. import time
  19. def merge(lista, p, q, r):
  20. left = lista[p:q+1] # copy the left subarray
  21. right = lista[q+1:r+1] # copy the right subarray
  22. i = 0 # index for the left subarray
  23. j = 0 # index for the right subarray
  24. k = p # index for the sorted list
  25. # Keep adding to the sorted list, while both lists have elements
  26. while i < len(left) and j < len(right):
  27. if left[i] <= right[j]:
  28. lista[k] = left[i]
  29. i += 1
  30. else:
  31. lista[k] = right[j]
  32. j += 1
  33. k += 1
  34. # If right finished first, then fill up the rest with the left subarray
  35. while i < len(left):
  36. lista[k] = left[i]
  37. i += 1
  38. k += 1
  39. # If left finished first, then fill up the rest with the right subarray
  40. while j < len(right):
  41. lista[k] = right[j]
  42. j += 1
  43. k += 1
  44. def mergeSortAux(lista, p, r):
  45. # If array has one element or less, return
  46. if p >= r:
  47. return
  48. # Else, split the array in half
  49. q = int((p+r)/2) # find the middle
  50. mergeSortAux(lista, p, q) # Sort the left subarray
  51. mergeSortAux(lista, q+1, r) # Sort the right subarray
  52. merge(lista, p, q, r) # Combine both subarrays
  53. def mergeSort(listaMerge):
  54. #definan el algoritmo de ordenamiento mergesort
  55. mergeSortAux(listaMerge, 0, len(listaMerge)-1)
  56. return listaMerge
  57. #===============================
  58. #Modificación a código: Diego
  59. #Añado función heapify
  60. #===============================
  61. def heapify(listaHeap, largoLista, i):
  62. largest = i
  63. left = 2 * i + 1
  64. right = 2 * i + 2
  65. if left < largoLista and listaHeap[i] < listaHeap[left]:
  66. largest = left
  67. if right < largoLista and listaHeap[largest] < listaHeap[right]:
  68. largest = right
  69. if largest != i:
  70. listaHeap[i], listaHeap[largest] = listaHeap[largest], listaHeap[i]
  71. heapify(listaHeap, largoLista, largest)
  72. #Fin de función heapify
  73. #===============================
  74. def heapSort(listaHeap):
  75. #definan el algoritmo de ordenamiento heapsort
  76. for i in range(len(listaHeap) / 2, -1, -1):
  77. heapify(listaHeap, len(listaHeap), i)
  78. for i in range(len(listaHeap) - 1, 0, -1):
  79. listaHeap[i], listaHeap[0] = listaHeap[0], listaHeap[i]
  80. heapify(listaHeap, i, 0)
  81. return listaHeap
  82. return lista
  83. #Se le da credito al programador de la funcion al final del codigo
  84. def quickSort(lista):
  85. #definan el algoritmo de ordenamiento quicksort
  86. return lista
  87. def shellSort(lista):
  88. # Subarrays are sorted according to intervals
  89. # After each set of subarrays is sorted, interval value is updated and process repeats
  90. # Function stops once iteration with interval = 1 has executed
  91. # print(lista)
  92. interval = len(lista) // 2
  93. while interval > 0:
  94. # Process repeats for each value between 1 -> interval
  95. for i in range(0, interval):
  96. # Starting index determines initial portion of the array that is sorted
  97. sortedIndex = i
  98. # Process repeats as long as the current value being considered is greater than the value to its left
  99. # Being greater than the value to its left means that it is not in the correct location
  100. j = i
  101. while j + interval < len(lista):
  102. if lista[j] > lista[j + interval]:
  103. # Swapping values so that smaller value is to the left
  104. temp = lista[j]
  105. lista[j] = lista[j + interval]
  106. lista[j + interval] = temp
  107. # print(lista)
  108. n = j
  109. # Continue comparing value that was swapped left to other values to the left to make sure it is placed in the correct location
  110. while n - interval >= 0 and lista[n] < lista[n - interval]:
  111. # Swapping values so that smaller value is to the left
  112. temp = lista[n]
  113. lista[n] = lista[n - interval]
  114. lista[n - interval] = temp
  115. n -= interval
  116. # print(lista)
  117. # Update index to continue comparison with the next value in the sub array
  118. j += interval
  119. interval //= 2
  120. # print(lista)
  121. return lista
  122. maxValor=1000 #define el valor maximo de los elementos de la lista
  123. largoLista=1000 #define el largo de las listas a ordenar
  124. veces=100 #define las veces que se va a hacer el ordenamiento
  125. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  126. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  127. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  128. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  129. for i in range(veces):
  130. #Creamos una lista con valores al azar
  131. lista = [randint(0,maxValor) for r in range(largoLista)]
  132. listaMerge = lista[:]
  133. listaHeap = lista[:]
  134. listaQuick = lista[:]
  135. listaShell = lista[:]
  136. t1 = time.clock() #seteamos el tiempo al empezar
  137. mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort
  138. acumulaMerge+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  139. t1 = time.clock() #seteamos el tiempo al empezar
  140. heapSort(listaHeap) #ejecutamos el algoritmo heapSort
  141. acumulaHeap+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  142. t1 = time.clock() #seteamos el tiempo al empezar
  143. quickSort(listaQuick) #ejecutamos el algoritmo quickSort
  144. acumulaQuick+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  145. t1 = time.clock() #seteamos el tiempo al empezar
  146. shellSort(listaShell) #ejecutamos el algoritmo shellSort
  147. acumulaShell+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  148. #imprimos los resultados
  149. print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista)
  150. print "MergeSort " + str(acumulaMerge/veces) + " segundos"
  151. print "HeapSort " + str(acumulaHeap/veces) + " segundos"
  152. print "QuickSort " + str(acumulaQuick/veces) + " segundos"
  153. print "ShellSort " + str(acumulaShell/veces) + " segundos"