No Description

sorting.py 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. # -*- coding: utf-8 -*-
  2. """
  3. Carlos J Corrada Bravo
  4. Este programa calcula el promedio de tiempo de ejecución de cuatro algoritmos de ordenamiento
  5. La variable maxValor define el valor maximo de los elementos de la lista
  6. La variable largoLista define el largo de las listas a ordenar
  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. def mergeSort(lista):
  13. #Camila Vazquez Rodriguez
  14. #definan el algoritmo de ordenamiento mergesort
  15. if len(lista) > 1:
  16. mid = len(lista)//2
  17. L = lista[:mid]
  18. R = lista[mid:]
  19. mergeSort(L)
  20. mergeSort(R)
  21. i = 0
  22. j = 0
  23. k = 0
  24. while i < len(L) and j < len(R):
  25. if L[i] <= R[j]:
  26. lista[k] = L[i]
  27. i += 1
  28. else:
  29. lista[k] = R[j]
  30. j += 1
  31. k += 1
  32. while i < len(L):
  33. lista[k] = L[i]
  34. i += 1
  35. k += 1
  36. while j < len(R):
  37. lista[k] = R[j]
  38. j += 1
  39. k += 1
  40. return lista
  41. def heapSort(lista):
  42. #definan el algoritmo de ordenamiento heapsort
  43. """
  44. Carlos Hernández
  45. Implementación de heapSort.
  46. """
  47. def max_heapify(lista, idx, heap_size):
  48. """Convertir el nodo `idx` y sus descendientes en un max heap."""
  49. left_idx = 2 * idx + 1
  50. right_idx = 2 * idx + 2
  51. largestval_idx = idx
  52. if left_idx < heap_size and lista[idx] < lista[left_idx]:
  53. largestval_idx = left_idx
  54. if right_idx < heap_size and lista[largestval_idx] < lista[right_idx]:
  55. largestval_idx = right_idx
  56. if largestval_idx != idx:
  57. lista[idx], lista[largestval_idx] = lista[largestval_idx], lista[idx]
  58. max_heapify(lista, largestval_idx, heap_size)
  59. def build_max_heap(lista, heap_size):
  60. """Construir un max heap the un heap dado."""
  61. for idx in range((heap_size - 1) // 2, -1, -1):
  62. max_heapify(lista, idx, heap_size)
  63. heap_size = len(lista)
  64. build_max_heap(lista, heap_size)
  65. for idx in range(len(lista) - 1, 0, -1):
  66. lista[0], lista[idx] = lista[idx], lista[0]
  67. heap_size -= 1
  68. max_heapify(lista, 0, heap_size)
  69. return lista
  70. def quickSort(lista):
  71. #Establecemos los arreglos para guardar las particiones
  72. less = []
  73. equal = []
  74. greater = []
  75. #Empezamos a iterar el arreglo y ver si los elementos son
  76. #menores, mayores o iguales que un pivot.
  77. if len(lista) > 1:
  78. pivot = lista[0]
  79. for x in lista:
  80. if x < pivot:
  81. less.append(x)
  82. elif x == pivot:
  83. equal.append(x)
  84. elif x > pivot:
  85. greater.append(x)
  86. #Hacemos una llamada recursiva para seguir ordenando
  87. #las diferentes partes del arreglo. Despues a lo ultimo
  88. #juntamos todas las partes ordenadas.
  89. return quickSort(less)+equal+quickSort(greater)
  90. else:
  91. return lista
  92. def shellSort(lista):
  93. #definan el algoritmo de ordenamiento shellsort
  94. #El algoritmo compara elementos de una lista
  95. #que tienen una distancia fija entre ellos, la
  96. #differencia en distancia se minimiza por cada
  97. #iterazion del algoritmo
  98. num = int(len(lista))
  99. dif = int(num/2)
  100. while dif > 0:
  101. for i in range(int(dif),int(num)):
  102. a = lista[i]
  103. j = i
  104. #por cada intervalo se reorganizara los elementos
  105. #si se cumple la declaracion dentro del while loop
  106. while j >= dif and lista[int(j - dif)] > a:
  107. lista[int(j)] = lista[int(j - dif)]
  108. j -= dif
  109. lista[int(j)] = a
  110. dif/= 2
  111. return lista
  112. maxValor=1000 #define el valor maximo de los elementos de la lista
  113. largoLista=1000 #define el largo de las listas a ordenar
  114. veces=100 #define las veces que se va a hacer el ordenamiento
  115. acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort
  116. acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort
  117. acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort
  118. acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort
  119. for i in range(veces):
  120. lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar
  121. t1 = time.clock() #seteamos el tiempo al empezar
  122. mergeSort(lista) #ejecutamos el algoritmo mergeSort
  123. acumulaMerge+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  124. t1 = time.clock() #seteamos el tiempo al empezar
  125. heapSort(lista) #ejecutamos el algoritmo heapSort
  126. acumulaHeap+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  127. t1 = time.clock() #seteamos el tiempo al empezar
  128. quickSort(lista) #ejecutamos el algoritmo quickSort
  129. acumulaQuick+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  130. t1 = time.clock() #seteamos el tiempo al empezar
  131. shellSort(lista) #ejecutamos el algoritmo shellSort
  132. acumulaShell+=time.clock()-t1 #acumulamos el tiempo de ejecucion
  133. #imprimos los resultados
  134. print ("Promedio de tiempo de ejecucion de " + str(veces) + " listas de largo " + str(largoLista))
  135. print ("MergeSort " + str(acumulaMerge/veces) + " segundos")
  136. print ("HeapSort " + str(acumulaHeap/veces) + " segundos")
  137. print ("QuickSort " + str(acumulaQuick/veces) + " segundos")
  138. print ("ShellSort " + str(acumulaShell/veces) + " segundos")