def merge(graph, left, middle, right): global stop_recursive_sort i, j = left, middle + 1 m = [] arr = graph.bars while i <= middle and j <= right: if events.sort_event(graph) == "Stop sort": stop_recursive_sort = True if stop_recursive_sort == True: return None if arr[i] < arr[j]: m.append(arr[i]) i += 1 elif arr[i] > arr[j]: m.append(arr[j]) j += 1 else: m.append(arr[i]) m.append(arr[j]) i += 1 j += 1 m.extend(arr[i:middle+1]) m.extend(arr[j:right+ 1]) arr[left:right+1] = m graph.update_bar_positions() for bar in arr[left:right+1]: graph.draw_single_bar(bar.position)
def sort(self): global stop_recursive_sort done = 0 for _ in range(len(self.heap)): if events.sort_event(self.graph) == "Stop sort": stop_recursive_sort = True if stop_recursive_sort == True: return None self.extract_max(done) done += 1
def insertion_sort(graph): arr = graph.bars for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: if events.sort_event(graph) == "Stop sort": # stop on sort keypress return None arr[j+1] = arr[j] graph.draw_single_bar(j+1) graph.draw_key(key, j) j -= 1 arr[j+1] = key graph.draw_single_bar(j+1) graph.issorted = True return None
def bubble_sort(graph): """ bubble sorts a graph object """ bars = graph.bars j = 0 while True: count = 0 for i in range(0, len(bars)-j-1): if events.sort_event(graph) == "Stop sort": # stop on sort keypress return None if bars[i] > bars[i+1]: swap_bars(graph, i, i+1) graph.draw_two_bars(i, i+1) count += 1 j += 1 if count == 0: graph.issorted = True return None
def merge_sort(graph, left = 0, right = None, isfirst_call = False): global stop_recursive_sort if isfirst_call == True: stop_recursive_sort = False if right == None: right = len(graph.bars) -1 for j in range(left, right): if events.sort_event(graph) == "Stop sort": stop_recursive_sort = True if stop_recursive_sort == True: return None if left >= right: return None middle = left + (right - left) // 2 merge_sort(graph, left, middle) merge_sort(graph, middle + 1, right) merge(graph, left, middle, right)
def heapify(self, index, done = 0): global stop_recursive_sort if events.sort_event(self.graph) == "Stop sort": stop_recursive_sort = True if stop_recursive_sort == True: return None left = (index * 2) + 1 right = (index * 2) + 2 maximum = index if left < (len(self.heap) - done) and self.heap[left] > self.heap[maximum]: maximum = left if right < (len(self.heap) - done) and self.heap[right] > self.heap[maximum]: maximum = right if maximum == index: return None else: self.__swap(index, maximum) self.graph.draw_two_bars(index, maximum) self.heapify(maximum, done)
def partition(graph, left, right): global stop_recursive_sort if stop_recursive_sort == True: return None bars = graph.bars set_pivot(graph, left, right) pivot = bars[right] i = left - 1 for j in range(left, right): if events.sort_event(graph) == "Stop sort": stop_recursive_sort = True if bars[j] < pivot: i += 1 swap_bars(graph, i, j) graph.draw_two_bars(i, j) swap_bars(graph, i+1, right) graph.draw_two_bars(i+1, right) return i+1