Пример #1
0
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)
Пример #2
0
    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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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)
Пример #6
0
    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)
Пример #7
0
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