选择排序,但我希望输出合并

Posted

技术标签:

【中文标题】选择排序,但我希望输出合并【英文标题】:Selection Sorter, but i want the output to merge 【发布时间】:2022-01-14 07:47:12 【问题描述】:

所以我想做一个排序器,但我希望它的输出合并。在我的代码中,我将两个不同类型的变量从列表中分离出来,整数和整数。

列表:

nlist = [19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]

代码:

def bubble(collection):
    dlist = [e for e in collection if isinstance(e, int)]
    clist = [e for e in collection if not isinstance(e, int)]
    for endnum in range(len(dlist)-1, 0, -1): 
        print(dlist)
        for i in range(endnum):
            if dlist[i] > dlist[i+1]:
                dlist[i], dlist[i+1] = dlist[i+1], dlist[i]
    for endnumm in range(len(clist)-1, 0, -1): 
        print(clist)
        for j in range(endnumm):
            if clist[j] > clist[j+1]:
                clist[j], clist[j+1] = clist[j+1], clist[j]
    answer = dlist + clist
    print(answer)

输出:

[19, 5, 2, 32, 7]
[5, 2, 19, 7, 32]
[2, 5, 7, 19, 32]
[2, 5, 7, 19, 32]
['cat', 'rabbit', 'mice', 'dog']
['cat', 'mice', 'dog', 'rabbit']
['cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

所需输出:

[19, 5, 'cat', 2, 'rabbit', 32, 'mice', 'dog', 7]
[19, 5, 'cat', 2, 32, 'rabbit', 'mice', 'dog', 7]
[19, 5, 'cat', 2, 32, 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 'cat', 32, 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 32, 'cat', 'rabbit', 'mice', 7, 'dog']
[19, 5, 2, 32, 'cat', 'rabbit', 7, 'mice', 'dog']
[19, 5, 2, 32, 'cat', 7, 'rabbit', 'mice', 'dog']
[19, 5, 2, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 19, 2, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 32, 7, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[5, 2, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 19, 7, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 7, 19, 32, 'cat', 'rabbit', 'mice', 'dog']
[2, 5, 7, 19, 32, 'cat', 'mice', 'rabbit', 'dog']
[2, 5, 7, 19, 32, 'cat', 'mice', 'dog', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

有什么方法可以让我输出到所需的输出?

之前的同一个家伙刚刚解决了一些问题和问题。

【问题讨论】:

【参考方案1】:

一般方法

您可以通过考虑您的“大于”关系比 Python 的 > 稍微复杂一点来解决这个问题:

对于两个数字,> 适用, 对于两个字符串,> 适用, 在任意数字和任意字符串之间,字符串“大于”数字。

现在,实现一个函数,并在您的算法中使用它而不是 >

实施该方法

让我们将该逻辑写入函数my_greater_than

def my_greater_than(a, b):
    """greater than where an int is "smaller" than other things"""
    if isinstance(a, int):
        if isinstance(b, int):
            return a > b
        else:
            return False
    else:
        if isinstance(b, int):
            return True
        else:
            return a > b

你会注意到我在这里走捷径:我不检查str,我只检查int,并在else 子句中假设str

为了清楚起见,这非常冗长,但我们可以更简洁地编写相同的逻辑,如下所示:

def my_greater_than(a, b):
    """greater than where an int is "smaller" than other things"""
    if isinstance(a, int):
        return isinstance(b, int) and a > b
    else:
        return isinstance(b, int) or a > b

现在,让我们在冒泡排序代码中使用它来代替 >。我完全保留了你的冒泡排序算法,但只用我们在整个列表中使用的大于函数调用它一次。

def bubble(collection):
    my_list = list(collection)
    for endnum in range(len(my_list)-1, 0, -1): 
        print(my_list)
        for i in range(endnum):
            if my_greater_than(my_list[i], my_list[i+1]):
                my_list[i], my_list[i+1] = my_list[i+1], my_list[i]
    print(my_list)

现在我们可以在你的列表中调用它来获得你想要的输出:

nlist = [19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]
bubble(nlist)

打印

[19, 5, 'cat', 'rabbit', 2, 32, 'mice', 'dog', 7]
[5, 19, 'cat', 2, 32, 'mice', 'dog', 7, 'rabbit']
[5, 19, 2, 32, 'cat', 'dog', 7, 'mice', 'rabbit']
[5, 2, 19, 32, 'cat', 7, 'dog', 'mice', 'rabbit']
[2, 5, 19, 32, 7, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 19, 7, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']
[2, 5, 7, 19, 32, 'cat', 'dog', 'mice', 'rabbit']

补充说明

您可能会注意到我在bubble() 的第一行将collection 复制到my_list。那是因为我不想修改我提供的输入列表。如果我们直接在collection 上工作,我们会发现nlist 在调用bubble() 之后也是排序的。 通过调用list() 来复制集合的另一个原因是它允许我们接受任何可迭代的内容。集合可以是集合、列表、元组、字典或 Python 中的任何其他可迭代对象,我们的排序函数无论如何都可以处理它。 我打印了输出,因为这就是你所做的,但我通常会有一个返回语句:将bubble() 最后一行的print(my_list) 替换为return my_list

【讨论】:

你能帮我做什么,做什么? 嗯,是的,我可以,但我现在必须问:这是编程作业吗?无论如何,这显然是一个学习练习,因此我认为我已经提供了您需要继续进行的关键见解,如果您自己解决下一步,您将从练习中获得更多。 一个没有评分的练习,这就是为什么我对下一步该做什么知之甚少 好的,我会字节的。即将编辑。

以上是关于选择排序,但我希望输出合并的主要内容,如果未能解决你的问题,请参考以下文章

超大:排序算法之冒泡插入和选择排序

合并排序相同的输出 C++

排序提示若执行此操作所有合并单元格需大小相同

《OD学算法》排序

二叉搜索树的根插入选择删除合并排序等操作的实现

XSLT 转换 XML:选择 uuid 并按顺序排序