|
5 | 5 |
|
6 | 6 | class Array:
|
7 | 7 |
|
| 8 | + full_array = None |
| 9 | + |
8 | 10 | def plot(self):
|
9 | 11 | if not test:
|
10 |
| - vs.plot(self.values) |
| 12 | + vs.plot(Array.full_array) |
11 | 13 |
|
12 | 14 | def set_all(self, values):
|
13 | 15 | for i in range(len(self.values)):
|
14 | 16 | self.values[i] = values[i]
|
| 17 | + for i in range(len(self.values)): |
| 18 | + Array.full_array[self.lower_index + i] = values[i] |
15 | 19 | self.plot()
|
16 | 20 |
|
17 |
| - def __init__(self, values): |
| 21 | + def __init__(self, values, lower_index=0, higher_index=-1): |
| 22 | + self.lower_index = lower_index |
| 23 | + self.higher_index = len(values) if higher_index == -1 else higher_index |
18 | 24 | self.values = list(values)
|
19 | 25 |
|
| 26 | + if Array.full_array == None: |
| 27 | + Array.full_array = list(values) |
| 28 | + |
20 | 29 | def swap(self, index1, index2):
|
21 | 30 | self.values[index2], self.values[index1] = self.values[index1], self.values[index2]
|
| 31 | + Array.full_array[self.lower_index + index2], Array.full_array[self.lower_index + index1] = Array.full_array[self.lower_index + index1], Array.full_array[self.lower_index + index2] |
22 | 32 | self.plot()
|
23 | 33 |
|
24 | 34 | def set(self, index, num):
|
25 | 35 | self.values[index] = num
|
| 36 | + Array.full_array[self.lower_index + index] = num |
26 | 37 | self.plot()
|
27 | 38 |
|
28 | 39 | def get_len(self):
|
@@ -110,13 +121,14 @@ def heapify(nums, heap_size, root_index):
|
110 | 121 | heapify(nums, i, 0)
|
111 | 122 |
|
112 | 123 |
|
113 |
| -def merge_sort(nums): # n * logn |
114 |
| - |
| 124 | +def merge_sort(nums, lower_index=0, higher_index=-1): # n * logn |
| 125 | + if higher_index == -1: |
| 126 | + higher_index = lower_index + nums.get_len() |
115 | 127 | def merge(left_list, right_list):
|
116 | 128 | sorted_list = []
|
117 | 129 | left_list_index = right_list_index = 0
|
118 | 130 |
|
119 |
| - # We use the list lengths often, so its handy to make variables |
| 131 | + # We use the list lengths often, so it's handy to make variables |
120 | 132 | left_list_length, right_list_length = len(left_list), len(right_list)
|
121 | 133 |
|
122 | 134 | for _ in range(left_list_length + right_list_length):
|
@@ -154,8 +166,8 @@ def merge(left_list, right_list):
|
154 | 166 | mid = nums.get_len() // 2
|
155 | 167 |
|
156 | 168 | # Sort and merge each half
|
157 |
| - left_list = merge_sort(Array(nums.values[:mid])) |
158 |
| - right_list = merge_sort(Array(nums.values[mid:])) |
| 169 | + left_list = merge_sort(Array(nums.values[:mid], lower_index, mid)) |
| 170 | + right_list = merge_sort(Array(nums.values[mid:], mid, nums.get_len()), mid, nums.get_len()) |
159 | 171 |
|
160 | 172 | nums.set_all(left_list + right_list)
|
161 | 173 |
|
|
0 commit comments