123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- from SoSe24.algodat.foundation import AlgoDatArray, AlgoDatValue, read_int_sequence
- from time import perf_counter as pfc
-
-
- def partition(z: AlgoDatArray, left: int, right: int) -> int:
- global pivot
- pivot.value = z[right]
- i = left
- j = right - 1
- while i < j:
- while z[i] < pivot:
- i += 1
- while z[j] > pivot:
- j -= 1
- if i < j:
- z[i], z[j] = z[j], z[i]
- i += 1
- j -= 1
- if i==j and z[i] < pivot:
- i += 1
- if z[i] != pivot:
- z[i], z[right] = z[right], z[i]
- return i
-
-
- def median_pivot(z: AlgoDatArray, left: int, right: int) -> int:
- mid = left + (right - left) // 2
- if z[left] < z[right]:
- if z[mid] < z[right]:
- # right is the largest
- if z[mid] < z[left]:
- # left is in the middle
- z[left], z[right] = z[right], z[left]
- else:
- # mid is in the middle
- z[mid], z[right] = z[right], z[mid]
- else:
- # right is in the middle
- pass
- else:
- if z[mid] < z[right]:
- # right is in the middle
- pass
- else:
- #right is the smallest
- if z[mid] < z[left]:
- # mid is in the middle
- z[mid], z[right] = z[right], z[mid]
- else:
- # mid is in the middle
- z[left], z[right] = z[right], z[left]
- return partition(z, left, right)
-
-
- def quick_sort(z: AlgoDatArray, left: int, right: int):
- if left < right:
- q = partition(z, left, right)
- #q = median_pivot(z, left, right)
- quick_sort(z, left, q-1)
- quick_sort(z, q+1, right)
-
-
- pivot = AlgoDatValue(0)
-
- if __name__ == "__main__":
- z = read_int_sequence("../../seq3.txt")
- print(z, len(z))
- start = pfc()
- quick_sort(z, 0, z.size-1)
- print(z)
- print(f"Dauer: {pfc() - start:.4f}s")
- AlgoDatValue.summary()
|