Example #1
0
def shaker_sort(array):
    print("[log] run shaker_sort")
    method = "shaker sort"
    count = 0

    l = 0
    r = len(array) - 1
    while l < r:

        for i in range(l, r):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                shift = i
            gi.make_image(array, count, method, i, -1)
            count += 1
        r = shift

        for i in range(r, l, -1):
            if array[i] < array[i - 1]:
                array[i], array[i - 1] = array[i - 1], array[i]
                shift = i
            gi.make_image(array, count, method, i, -1)
            count += 1
        l = shift

    gi.make_endimage(array, count, method)
Example #2
0
def msd_radix(array, l, r, count, method, N=2):
    work = array[:]
    if r - l <= 10:
        print(r - l)
        array, count = msd_insert(array, l, r, count, method)
    else:
        C = [0] * 257
        shift = N * 2
        for i in range(l, r + 1):
            C[(array[i] >> shift) & 0xff] += 1
            #print("{0:02o} {0:08b} {1:08b}".format(array[i],(array[i] >> shift)))
        for i in range(1, 257):
            C[i] += C[i - 1]
        for i in range(l, r - 1, -1):
            j = (array[i] >> shift) & 0xff
            C[j] -= 1
            work[C[j] + l] = array[i]
        for i in range(l, r + 1):
            array[i] = work[i]

        gi.make_image(array, count, method, -1, -1)
        count += 1

        if N > 0:
            C[256] = r - l + 1
            for i in range(0, 256):
                L = l + C[i]
                R = l + C[i + 1] - 1
                if L < R:
                    array, count = msd_radix(array, L, R, count, method, N - 1)

    return array, count
Example #3
0
def lsd_radix_sort(array):
    print("[log] run LSD radix sort")
    method = "radix sort (LSD)"
    count = 0
    r = 10
    m = 1

    rad = array[:]
    y = array[:]

    while m <= r:
        for i in range(len(array)):
            rad[i] = (array[i] // m) % 10
        k = 0
        for i in range(10):
            for j in range(len(array)):
                if rad[j] == i:
                    y[k] = array[j]
                    k += 1
        for i in range(len(array)):
            array[i] = y[i]
            gi.make_image(array, count, method, i, -1)
            count += 1
        m *= 10

    gi.make_endimage(array, count, method)
Example #4
0
def msd_insert(array, l, r, count, method):
    for i in range(l, r - 1):
        m = i
        for j in range(i + 1, r):
            if array[m] > array[j]:
                m = j
            gi.make_image(array, count, method, i, m)
            count += 1
        array[m], array[i] = array[i], array[m]

    return array, count
Example #5
0
def selection_sort(array):
    print("[log] run selection sort")
    method = "selection sort"
    count = 0
    n = len(array)
    for i in range(n - 1):
        least = i
        for j in range(i + 1, n):
            if array[j] < array[least]:
                least = j
            gi.make_image(array, count, method, j, least)
            count += 1
            #sys.exit()
        array[i], array[least] = array[least], array[i]
    gi.make_endimage(array, count, method)
Example #6
0
def bubble_sort(array):
    print("[log] run bubble sort")
    method = "bubble sort"
    count = 0
    n = len(array)
    for i in range(0, n):
        rev = range(i, n)
        for j in reversed(rev):
            if array[j - 1] > array[j]:
                temp = array[j - 1]
                array[j - 1] = array[j]
                array[j] = temp
            gi.make_image(array, count, method, j - 1, -1)
            count += 1
    gi.make_endimage(array, count, method)
Example #7
0
def gravity_sort(arr):
    print("[log] run gravity sort")
    method = "gravity sort"
    count = 0

    mat = arrtomat(arr)
    x = array.array('i')

    while mat != x:
        gi.make_image(arr, count, method, -1, -1)
        count += 1
        x = mat
        mat = gravity(mat)
        arr = mattoarr(mat)

    gi.make_endimage(arr, count, method)
Example #8
0
def gnome_sort(array):
    print("[log] run gnome sort")
    method = "gnome sort"
    count = 0
    gnome = 1

    while gnome < len(array):
        if gnome >= 1 and array[gnome - 1] > array[gnome]:
            array[gnome], array[gnome - 1] = array[gnome - 1], array[gnome]
            gnome -= 1
        else:
            gnome += 1
        gi.make_image(array, count, method, gnome - 1, -1)
        count += 1

    gi.make_endimage(array, count, method)
Example #9
0
def stooge(array, count, m, l, r):
    if array[l] > array[r]:
        array[l], array[r] = array[r], array[l]

    t = (r - l + 1) // 3

    if t < 1:
        return array, count

    array, count = stooge(array, count, m, l, r - t)
    array, count = stooge(array, count, m, l + t, r)
    array, count = stooge(array, count, m, l, r - t)

    gi.make_image(array, count, m, l, r)
    count += 1

    return array, count
Example #10
0
def comb_sort(array):
    print("[log] run comb sort")
    method = "comb sort"
    count = 0

    h = len(array)
    f = False

    while (h > 1 or f):
        h = (h * 10) // 13
        f = False
        for i in range(len(array) - h):
            if array[i] > array[i + h]:
                array[i], array[i + h] = array[i + h], array[i]
            gi.make_image(array, count, method, i, i + h)
            count += 1

    gi.make_endimage(array, count, method)
Example #11
0
def insertion_sort(array):
    print("[log] run insertion sort")
    method = "insertion sort"
    count = 0
    n = len(array)
    for i in range(1, n):
        tmp = array[i]
        if tmp < array[i - 1]:
            j = i
            while True:
                array[j] = array[j - 1]
                gi.make_image(array, count, method, j, -1)
                count += 1
                j -= 1
                if j <= 0 or tmp >= array[j - 1]:
                    break
            array[j] = tmp
        #sys.exit()
    gi.make_endimage(array, count, method)
Example #12
0
def downheap(array, count, m, root, bot):
    l = root * 2 + 1
    r = root * 2 + 2

    if l <= bot and array[l] > array[root]:
        maxch = l
    else:
        maxch = root

    if r <= bot and array[r] > array[maxch]:
        maxch = r

    if maxch != root:
        array[root], array[maxch] = array[maxch], array[root]
        array, count = downheap(array, count, m, maxch, bot)

    gi.make_image(array, count, m, root, maxch)
    count += 1

    return array, count
Example #13
0
def oddeven_sort(array):
    print("[log] run oddeven sort")
    method = "oddeven sort"
    count = 0

    ischange = True

    while ischange:
        ischange = False
        for i in range(0, len(array) - 1, 2):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                ischange = True
            gi.make_image(array, count, method, i, i + 1)
            count += 1
        for i in range(1, len(array) - 1, 2):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                ischange = True
            gi.make_image(array, count, method, i, i + 1)
            count += 1

    gi.make_endimage(array, count, method)
Example #14
0
def shell_sort(array):
    print("[log] run shell sort")
    method = "shell sort"
    count = 0
    inc = 4
    while inc > 0:
        for i in range(len(array)):
            j = i
            temp = array[i]
            while j >= inc and array[j - inc] > temp:
                array[j] = array[j - inc]
                j = j - inc
            array[j] = temp
            gi.make_image(array, count, method, i, -1)
            count += 1

        if inc // 2 != 0:
            inc = inc // 2
        elif inc == 1:
            inc = 0
        else:
            inc = 1

    gi.make_endimage(array, count, method)
Example #15
0
def quick(array, l, r, count, m):
    p = array[l]
    lh = l
    rh = r

    while l < r:
        while array[r] >= p and l < r:
            r -= 1

        if l != r:
            array[l] = array[r]
            l += 1

        gi.make_image(array, count, m, l, r)
        count += 1

        while array[l] <= p and l < r:
            l += 1

        if l != r:
            array[r] = array[l]
            r -= 1

        gi.make_image(array, count, m, l, r)
        count += 1

    array[l] = p
    p = l
    l = lh
    r = rh
    if l < p:
        array, count = quick(array, l, p - 1, count, m)
    if r > p:
        array, count = quick(array, p + 1, r, count, m)

    return array, count
Example #16
0
def merge(array, l, r, count, m):
    if r - l < 1:
        return array, count
    mid = (l + r) // 2

    merged = array[:]
    array, count = merge(array, l, mid, count, m)
    array, count = merge(array, mid + 1, r, count, m)
    merged = array[:]

    i = l
    j = mid + 1

    while l <= mid and j <= r:
        if (array[l] <= array[j]):
            merged[i] = array[l]
            l += 1
        else:
            merged[i] = array[j]
            j += 1
        i += 1
        gi.make_image(merged, count, m, i - 1, -1)
        count += 1

    while l <= mid:
        merged[i] = array[l]
        i += 1
        l += 1
        gi.make_image(merged, count, m, i - 1, -1)
        count += 1

    while j <= r:
        merged[i] = array[j]
        i += 1
        j += 1
        gi.make_image(merged, count, m, i - 1, -1)
        count += 1

    return merged[:], count