Guest User

Untitled

a guest
Dec 16th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. #!/usr/bin/python3
  2. import time
  3. from random import randint, randrange
  4.  
  5. def bubbleSort(array):
  6. length = len(array)
  7. for i in range(0, length):
  8. is_sorted = True
  9. for j in range(0, length-i-1):
  10. if array[j] > array[j+1]:
  11. array[j], array[j+1] = array[j+1], array[j]
  12. is_sorted = False
  13. if is_sorted:
  14. break
  15. return array
  16.  
  17. def insertionSort(array):
  18. for i in range(1, len(array)):
  19. j = i
  20. while j > 0 and array[j-1] > array[i]:
  21. j -= 1
  22. if i != j:
  23. v = array[i]
  24. del array[i]
  25. array.insert(j, v)
  26. return array
  27.  
  28. def selectionSort(array):
  29. for i in range(len(array)):
  30. minimum = i
  31. for j in range(i, len(array)):
  32. if array[j] < array[minimum]:
  33. minimum = j
  34. if minimum != i:
  35. #array = array[:i] + [array[minimum]] + array[i:minimum] + array[minimum+1:]
  36. v = array[minimum]
  37. del array[minimum]
  38. array.insert(i, v)
  39. return array
  40.  
  41. def quickSort(array):
  42. if len(array) < 2:
  43. return array
  44. pivot = array[0]
  45. smaller, greater_equal = [], []
  46.  
  47. for i in range(1, len(array)):
  48. if array[i] < pivot:
  49. smaller.append(array[i])
  50. else:
  51. greater_equal.append(array[i])
  52. return quickSort(smaller) + [pivot] + quickSort(greater_equal)
  53.  
  54. def quickMid(array):
  55. """Pivot is in the middle of array."""
  56. l = len(array)
  57. if l < 2:
  58. return array
  59.  
  60. pivot_idx = l // 2
  61. pivot = array[pivot_idx]
  62. smaller, greater_equal = [], []
  63. for i in range(0, l):
  64. if i != pivot_idx:
  65. a = array[i]
  66. if a < pivot:
  67. smaller.append(a)
  68. else:
  69. greater_equal.append(a)
  70. return quickMid(smaller) + [pivot] + quickMid(greater_equal)
  71.  
  72. def quickRand(array):
  73. """Random position of a pivot."""
  74. l = len(array)
  75. if l < 2:
  76. return array
  77.  
  78. pivot_idx = randrange(0, l)
  79. pivot = array[pivot_idx]
  80. smaller, greater_equal = [], []
  81. for i in range(0, l):
  82. if i != pivot_idx:
  83. a = array[i]
  84. if a < pivot:
  85. smaller.append(a)
  86. else:
  87. greater_equal.append(a)
  88. return quickRand(smaller) + [pivot] + quickRand(greater_equal)
  89.  
  90. def mergeSort(array):
  91. l = len(array)
  92. if l == 1:
  93. return array
  94. elif l == 2:
  95. return [min(array), max(array)]
  96. mid = l // 2
  97. a = mergeSort(array[:mid])
  98. b = mergeSort(array[mid:])
  99.  
  100. p, i, j = 0, 0, 0
  101. # a should always be shorter than b (or of equal lengths).
  102. while i < len(a) and j < len(b):
  103. if a[i] < b[j]:
  104. array[p] = a[i]
  105. i += 1
  106. else:
  107. array[p] = b[j]
  108. j += 1
  109. p += 1
  110.  
  111. if i == len(a):
  112. while j < len(b):
  113. array[p] = b[j]
  114. p += 1
  115. j += 1
  116. elif j == len(b):
  117. while i < len(a):
  118. array[p] = a[i]
  119. p += 1
  120. i += 1
  121.  
  122. return array
  123.  
  124. def heapify(array, end, i):
  125. l = 2*i + 1
  126. r = 2*(i + 1)
  127. max = i
  128. if l < end and array[i] < array[l]:
  129. max = l
  130. if r < end and array[max] < array[r]:
  131. max = r
  132. if max != i:
  133. array[i], array[max] = array[max], array[i]
  134. if 2*max + 1 < end:
  135. heapify(array, end, max)
  136.  
  137. def heapSort(array):
  138. end = len(array)
  139. start = end // 2 - 1
  140. for i in range(start, -1, -1):
  141. heapify(array, end, i)
  142. for i in range(end-1, 0, -1):
  143. array[0], array[i] = array[i], array[0]
  144. heapify(array, i, 0)
  145. return array
  146.  
  147. # ------------------------------------------------------------
  148.  
  149. def test_procedure():
  150. # Naglowek tabeli.
  151. header = "{:>5} |" + 6*"{:>12}" + " |{:>12}"
  152. print(header.format("Size", "Bubble", "Insertion", "Selection", "Quick", "Merge", "Heap", "sorted()"))
  153. print("-" * 95)
  154.  
  155. # Format pojedynczego wiersza tabeli:
  156. # N | czasy 6 algorytmow | czas sorted()
  157. row = "{:>5} |" + 6*"{:>12.6f}" + " |{:>12.6f}"
  158.  
  159. for N in (1000, 5000, 10000, 12500, 15000, 20000, 25000, 30000, 35000, 40000):
  160. # Utworzenie N-elementowej tablicy danych.
  161. data = [randint(0, 4096) for _ in range(0, N)]
  162. start_t = time.time()
  163.  
  164. bub = bubbleSort(data[:])
  165. bub_t = time.time()
  166.  
  167. ins = insertionSort(data[:])
  168. ins_t = time.time()
  169.  
  170. sel = selectionSort(data[:])
  171. sel_t = time.time()
  172.  
  173. qui = quickSort(data[:])
  174. qui_t = time.time()
  175.  
  176. mer = mergeSort(data[:])
  177. mer_t = time.time()
  178.  
  179. hea = heapSort(data[:])
  180. hea_t = time.time()
  181.  
  182. # Do celow porownawczych.
  183. sor = sorted(data[:])
  184. sor_t = time.time()
  185.  
  186. print(row.format(N, bub_t-start_t, ins_t-bub_t, sel_t-ins_t, qui_t-sel_t, mer_t-qui_t, hea_t-mer_t, sor_t-hea_t))
  187.  
  188. def quickVariation():
  189. header = "{:>5} |" + 3*"{:>12}"
  190. print(header.format("Size", "Quick", "QuickMid", "QuickRand"))
  191. print("-" * 95)
  192.  
  193. row = "{:>5} |" + 3*"{:>12.6f}"
  194.  
  195. for N in (50, 100, 250, 500, 1000, 5000, 10000, 12500, 15000, 20000, 25000, 30000, 35000, 40000):
  196. data = [N - i for i in range(0, N)]
  197.  
  198. if N < 1000:
  199. try:
  200. start_t = time.time()
  201. qs = quickSort(data[:])
  202. qs_d = time.time() - start_t
  203. except Exception:
  204. qs_d = float('NaN')
  205. else:
  206. qs_d = float('NaN')
  207.  
  208. start_t = time.time()
  209.  
  210. qm = quickMid(data[:])
  211. qm_t = time.time()
  212.  
  213. qr = quickRand(data[:])
  214. qr_t = time.time()
  215.  
  216. print(row.format(N, qs_d, qm_t-start_t, qr_t-qm_t))
  217.  
  218. if __name__ == "__main__":
  219. #test_procedure()
  220. quickVariation()
Add Comment
Please, Sign In to add comment