手动排序4个数字

时间:2013-07-24 23:43:38

标签: python sorting math

我正在尝试对4个数字进行排序,而不使用任何内置函数。 这是我在某些情况下有效的方法。

#sort numbers

def sort_n(w, x, y, z):
    list = [w, x, y, z]
    while list[3] < list[2]:

        if list[0] > list[1]:
            list[0], list[1] = list[1], list[0]

        if list[1] > list[2]:
            list[1], list[2] = list[2], list[1]

        if list[2] > list[3]:
            list[2], list[3] = list[3], list[2]
    while list[1] < list[2]:

        if list[0] > list[1]:
            list[0], list[1] = list[1], list[0]

        if list[1] > list[2]:
            list[1], list[2] = list[2], list[1]

        if list[2] > list[3]:
            list[2], list[3] = list[3], list[2]

    while list[1] < list[0]:

        if list[0] > list[1]:
            list[0], list[1] = list[1], list[0]

        if list[1] > list[2]:
            list[1], list[2] = list[2], list[1]

        if list[2] > list[3]:
            list[2], list[3] = list[3], list[2]

    print list


sort_n(10, 1, 2, 3)

3 个答案:

答案 0 :(得分:1)

def bubble_sort(a_list):
    changed = True
    while changed:
        changed = False
        for i in range(len(a_list)-1):
            if a_list[i] > a_list[i+1]:
                 changed = True
                 a_list[i],a_list[i+1] = a_list[i+1],a_list[i]
    return a_list

无论如何我想......

答案 1 :(得分:0)

您可能正在寻找4个号码的optimal sorting network

Standard sorting networks for small values of n有更多细节(c),更基本的介绍here

遗憾的是,我无法找到n = 4案例的python实现。但上面链接的问题包含:

 - 4-input: 3 networks

[[1 2][3 4][1 3][2 4][2 3]]
[[1 3][2 4][1 2][3 4][2 3]]
[[1 4][2 3][1 2][3 4][2 3]]

如果我理解正确,你可以选择任何一行,然后进行那里描述的比较。所以走第一行:

if list[1] > list[2]: list[1], list[2] = list[2], list[1]
if list[3] > list[4]: list[3], list[4] = list[4], list[3]
if list[1] > list[3]: list[1], list[3] = list[3], list[1]
if list[2] > list[4]: list[2], list[4] = list[4], list[2]
if list[2] > list[3]: list[2], list[3] = list[3], list[2]

但我真的需要冲刺并且没有测试过......

答案 2 :(得分:0)

原地插入排序

def isort(a, f):
    for i in range(0, len(a)):
        for j in range(0, i):
            if f(a[i], a[j]):
                a[j], a[i] = a[i], a[j]
    return a

然后就可以这样使用

>>> isort([2,9,8,3], lambda x, y: x < y) # Ascending order
[2, 3, 8, 9]
>>> isort([2,9,8,3], lambda x, y: x > y) # Descending order
[9, 8, 3, 2]

但它确实使用内置的lenrange ...