You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

quick_sort.py 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from SoSe24.algodat.foundation import AlgoDatArray, AlgoDatValue, read_int_sequence
  2. from time import perf_counter as pfc
  3. def partition(z: AlgoDatArray, left: int, right: int) -> int:
  4. global pivot
  5. pivot.value = z[right]
  6. i = left
  7. j = right - 1
  8. while i < j:
  9. while z[i] < pivot:
  10. i += 1
  11. while z[j] > pivot:
  12. j -= 1
  13. if i < j:
  14. z[i], z[j] = z[j], z[i]
  15. i += 1
  16. j -= 1
  17. if i==j and z[i] < pivot:
  18. i += 1
  19. if z[i] != pivot:
  20. z[i], z[right] = z[right], z[i]
  21. return i
  22. def median_pivot(z: AlgoDatArray, left: int, right: int) -> int:
  23. mid = left + (right - left) // 2
  24. if z[left] < z[right]:
  25. if z[mid] < z[right]:
  26. # right is the largest
  27. if z[mid] < z[left]:
  28. # left is in the middle
  29. z[left], z[right] = z[right], z[left]
  30. else:
  31. # mid is in the middle
  32. z[mid], z[right] = z[right], z[mid]
  33. else:
  34. # right is in the middle
  35. pass
  36. else:
  37. if z[mid] < z[right]:
  38. # right is in the middle
  39. pass
  40. else:
  41. #right is the smallest
  42. if z[mid] < z[left]:
  43. # mid is in the middle
  44. z[mid], z[right] = z[right], z[mid]
  45. else:
  46. # mid is in the middle
  47. z[left], z[right] = z[right], z[left]
  48. return partition(z, left, right)
  49. def quick_sort(z: AlgoDatArray, left: int, right: int):
  50. if left < right:
  51. q = partition(z, left, right)
  52. #q = median_pivot(z, left, right)
  53. quick_sort(z, left, q-1)
  54. quick_sort(z, q+1, right)
  55. pivot = AlgoDatValue(0)
  56. if __name__ == "__main__":
  57. z = read_int_sequence("../../seq3.txt")
  58. print(z, len(z))
  59. start = pfc()
  60. quick_sort(z, 0, z.size-1)
  61. print(z)
  62. print(f"Dauer: {pfc() - start:.4f}s")
  63. AlgoDatValue.summary()