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()