Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.47 KB | None | 0 0
  1. I'm new to python, I wrote the following code. Please review,
  2. critique and enhance.
  3. Thanks for your help.
  4.  
  5. #This project compares quicksort, mergesort and bubblesort
  6. 1) write/test the partition routine for quicksort. (20 points) The # # rest of the code is given.
  7.  
  8. #1) write/test the partition routine for quicksort.
  9. def qS(items):
  10. quickSortHelper(items,0,len(items)-1)
  11.  
  12. def quickSortHelper(items,first,last):
  13. if first<last:
  14.  
  15. splitpoint = partition(items,first,last)
  16.  
  17. quickSortHelper(items,first,splitpoint-1)
  18. quickSortHelper(items,splitpoint+1,last)
  19.  
  20.  
  21. def partition(items,first,last):
  22. pivotvalue = items[first]
  23.  
  24. leftside = first+1
  25. rightside = last
  26.  
  27. done = False
  28. while not done:
  29.  
  30. while leftside <= rightside and items[leftside] <= pivotvalue:
  31. leftside = leftside + 1
  32.  
  33. while items[rightside] >= pivotvalue and rightside >= leftside:
  34. rightside = rightside -1
  35.  
  36. if rightside < leftside:
  37. done = True
  38. else:
  39. temp = items[leftside]
  40. items[leftside] = items[rightside]
  41. items[rightside] = temp
  42.  
  43. temp = items[first]
  44. items[first] = items[rightside]
  45. items[rightside] = temp
  46. return rightside
  47.  
  48. # 2) write/test the merging part of the mergesort.
  49. def mS(items):
  50. #print("Splitting ",items)
  51. if len(items)>1:
  52. mid = len(items)//2
  53. lefthalf = items[:mid]
  54. righthalf = items[mid:]
  55.  
  56. mS(lefthalf)
  57. mS(righthalf)
  58.  
  59. i=0
  60. j=0
  61. k=0
  62. while i < len(lefthalf) and j < len(righthalf):
  63. if lefthalf[i] < righthalf[j]:
  64. items[k]=lefthalf[i]
  65. i=i+1
  66. else:
  67. items[k]=righthalf[j]
  68. j=j+1
  69. k=k+1
  70.  
  71. while i < len(lefthalf):
  72. items[k]=lefthalf[i]
  73. i=i+1
  74. k=k+1
  75.  
  76. while j < len(righthalf):
  77. items[k]=righthalf[j]
  78. j=j+1
  79. k=k+1
  80.  
  81. # 3) write/test bubblesort. (10 points) No code is given.
  82. def bS(items):
  83. exchanges = True
  84. passnum = len(items)-1
  85. while passnum > 0 and exchanges:
  86. exchanges = False
  87. for i in range(passnum):
  88. if items[i]>items[i+1]:
  89. exchanges = True
  90. temp = items[i]
  91. items[i] = items[i+1]
  92. items[i+1] = temp
  93. passnum = passnum-1
  94.  
  95.  
  96. # 4) compare the sorts using lists of 10 and 50 items (in-order, reverse #order
  97. # and random (hard coded). Be sure
  98. # to print out the initial and sorted arrays so I can see that #your module
  99. # sorted properly. (10 points)
  100.  
  101. def mergeSort(L, ascending = True):
  102. result = []
  103. if len(L) == 1:
  104. return L
  105. mid = len(L) // 2
  106.  
  107. firsthalf = mergeSort(L[:mid])
  108.  
  109. secondhalf = mergeSort(L[mid:])
  110.  
  111. x, y = 0, 0
  112. while x < len(firsthalf) and y < len(secondhalf):
  113. if firsthalf[x] > secondhalf[y]: # < for descending
  114. result.append(secondhalf[y])
  115. y = y + 1
  116.  
  117. else:
  118. result.append(firsthalf[x])
  119. x = x + 1
  120. result = result + firsthalf[x:]
  121.  
  122. result = result + secondhalf[y:]
  123. if ascending == True :
  124. return result
  125. else:
  126. result.reverse()
  127. return result
  128.  
  129. def _quickSort(list):
  130. if len(list) <= 1:
  131. return list
  132. smaller, equal, larger = [], [], []
  133. pivot = random.choice(list)
  134.  
  135. for x in list:
  136. if x < pivot: smaller.append(x)
  137. elif x == pivot: equal.append(x)
  138. else: larger.append(x)
  139.  
  140.  
  141. return _quickSort(smaller) + equal + _quickSort(larger)
  142.  
  143. def quickSort(list, ascending=True):
  144. if ascending:
  145. return _quickSort(list)
  146. else:
  147. return _quickSort(list)[::-1]
  148.  
  149. def BubbleSortAsc(list):
  150. swapped = True
  151. sortedvalue=0
  152. while swapped:
  153. swapped = False
  154. sortedvalue+=1
  155. for i in range(0,len(list)-sortedvalue):
  156. if list[i]>list[i+1]:
  157. list[i], list[i+1], swapped = list[i+1], list[i], True
  158.  
  159. def BubbleSortDsc(list):
  160. swapped = True
  161. sortedvalue=0
  162. while swapped:
  163. swapped = False
  164. sortedvalue+=1
  165. for i in range (0,len(list)-sortedvalue):
  166. if list[i]<list[i+1]:
  167. list[i], list[i+1], swapped = list[i+1], list[i], True
  168.  
  169. list=[3,2,4,1,5,9,7,6]
  170.  
  171.  
  172. # 6) write/test a variation on quicksort (vqS) that makes the following
  173. # improvements:
  174. # chooses pivot by taking a small sample size (3 items) and using
  175. # median for pivot. (10 points)
  176.  
  177. def quicksort(array, l=0, r=-1):
  178.  
  179. if r == -1:
  180. r = len(array)
  181.  
  182. # base case
  183. if r-l <= 1:
  184. return
  185.  
  186. # pick the median of 3 possible pivots
  187. mid = int((l+r)*0.5)
  188. pivot = 0
  189. #pivots = [ l, mid, r-1]
  190. if array[l] > array[mid]:
  191. if array[r-1]> array[l]:
  192. pivot = l
  193. elif array[mid] > array[r-1]:
  194. pivot = mid
  195. else:
  196. if array[r-1] > array[mid]:
  197. pivot = mid
  198. else:
  199. pivot = r-1
  200.  
  201. i = l+1
  202. array[l], array[pivot] = array[pivot], array[l]
  203.  
  204. for j in range(l+1,r):
  205. if array[j] < array[l]:
  206. array[i], array[j] = array[j], array[i]
  207. i = i+1
  208.  
  209. array[l], array[i-1] = array[i-1], array[l]
  210.  
  211. quicksort(array, l, i-1)
  212. quicksort(array, i, r)
  213.  
  214. return array
  215. ls =[random.randrange(50) for _ in range(10)]
  216.  
  217.  
  218.  
  219.  
  220. #7) write/test a variation on mergesort (vmS) that makes the following
  221. # improvement:
  222. # Use insertion sort for small arrays (10 items or less).
  223.  
  224.  
  225. RUN = 10
  226. def insertionSort(arr, left, right):
  227.  
  228. for i in range(left + 1, right+1):
  229.  
  230. temp = arr[i]
  231. j = i - 1
  232. while arr[j] > temp and j >= left:
  233.  
  234. arr[j+1] = arr[j]
  235. j -= 1
  236.  
  237. arr[j+1] = temp
  238. def hybridSort(arr, n):
  239.  
  240. # Sort individual subarrays of size RUN
  241. for i in range(0, n, RUN):
  242. insertionSort(arr, i, min((i+31), (n-1)))
  243.  
  244. # start merging from size RUN (or 10). It will merge
  245.  
  246. size = RUN
  247. while size < n:
  248. for left in range(0, n, 2*size):
  249. mid = left + size - 1
  250. right = min((left + 2*size - 1), (n-1))
  251. merge(arr, left, mid, right)
  252. size = 2*size
  253.  
  254. # utility function to print the Array
  255. def printArray(arr, n):
  256.  
  257. for i in range(0, n):
  258. print(arr[i], end = " ")
  259. print()
  260. # Driver program to test above function
  261. if __name__ == "__main__":
  262.  
  263. arr = [5, 21, 7, 23, 19,25,2]
  264. n = len(arr)
  265.  
  266.  
  267.  
  268. items = [55,27,90,18,78,30,44,56,21,67]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement