|
1 | 1 | from random import random
|
2 | 2 |
|
3 | 3 |
|
4 |
| -def partition(arr, bottom, top): |
| 4 | +def partition(arr, bottom, top, comps, accesses): |
5 | 5 | i = bottom - 1
|
6 | 6 | pivot = arr[top]
|
7 | 7 | for j in range(bottom, top):
|
| 8 | + accesses += 1 |
| 9 | + comps += 1 |
8 | 10 | if arr[j] < pivot:
|
9 | 11 | i += 1
|
| 12 | + accesses += 3 |
10 | 13 | arr[i], arr[j] = arr[j], arr[i]
|
11 | 14 |
|
| 15 | + accesses += 4 |
12 | 16 | arr[i+1], arr[top] = arr[top], arr[i+1]
|
13 |
| - return (i + 1) |
| 17 | + return (i + 1, comps, accesses) |
14 | 18 |
|
15 | 19 |
|
16 |
| -def quick_sort(arr, bottom, top): |
| 20 | +def quick_sort(arr, bottom, top, comps, accesses): |
17 | 21 | if bottom < top:
|
18 |
| - pi = partition(arr, bottom, top) |
19 |
| - quick_sort(arr, bottom, pi-1) |
20 |
| - quick_sort(arr, pi+1, top) |
| 22 | + (pi, comps2, accesses2) = partition(arr, bottom, top, comps, accesses) |
| 23 | + comps += comps2 |
| 24 | + accesses += accesses2 |
| 25 | + quick_sort(arr, bottom, pi-1, comps, accesses) |
| 26 | + quick_sort(arr, pi+1, top, comps, accesses) |
| 27 | + return (comps, accesses) |
21 | 28 |
|
22 | 29 |
|
23 | 30 | if __name__ == "__main__":
|
24 | 31 | array = []
|
25 | 32 | for i in range(20):
|
26 | 33 | array.append(random())
|
27 |
| - quick_sort(array, 0, len(array) - 1) |
28 |
| - print(array) |
| 34 | + (comparisons, array_accesses) = quick_sort(array, 0, len(array) - 1, 0, 0) |
| 35 | + print("Quick sort:") |
| 36 | + print("No. comparisons: " + str(comparisons) + |
| 37 | + ", no. array accesses: " + str(array_accesses)) |
0 commit comments