【问题标题】:stable sorting using python bubble sort使用python冒泡排序进行稳定排序
【发布时间】:2013-11-08 21:13:08
【问题描述】:

所以,我得到了要按整数顺序排序的元组列表。我缺少的是使排序稳定..

如何使冒泡排序稳定? (保持类似物品的顺序)

def bubble_sort_2nd_value(tuples_list):
    NEWLIST = []
    ITEM_MOVE = 0
    for i in tuples_list:
        NEWLIST.append(i)
    for i in range(len(NEWLIST)):
         for j in range(i+1, len(NEWLIST)):
             if(NEWLIST[j][1] < NEWLIST[i][1]):
                 ITEM_MOVE = 1
                 NEWLIST[j],NEWLIST[i] = NEWLIST[i],NEWLIST[j]

    if (ITEM_MOVE == 0):
        print(tuples_list)
    else:
        print(NEWLIST)

tuples_list =  [('h2', 8), ('h4', 30), ('h6', 7), ('h8', 54), ('h1', 72), ('h3', 8), ('h5', 7), ('h7', 15), ('h7', 24)]

bubble_sort_2nd_value(tuples_list)

预期的测试结果和y结果比较: 显示元素 0 的输出 预期:[('h6', 7), ('h5', 7), ('h2', 8), ('h3', 8), ('h7', 15), ('h9', 24) , ('h4', 30), ('h8', 54), ('h1', 72)] 实际:[('h6', 7), ('h5', 7), ('h3', 8), ('h2', 8), ('h7', 15), ('h9', 24) , ('h4', 30), ('h8', 54), ('h1', 72)] result_code bubble_14 错误 1

注意 h2/3 混合...需要修复它.. 我的意思是不稳定

【问题讨论】:

  • 变量名全部大写,行中间随机制表符,使用01表示FalseTrue,不必要的括号等等……所有这些使您的代码更难阅读,因此也更难调试。
  • 同时,这不是冒泡排序。冒泡排序的重点在于,每次通过时,您只将每个元素与其直接相邻元素进行比较。您保留ITEM_MOVE 标志的原因是您需要继续循环直到它为假。所以,没有办法把它变成一个稳定的冒泡排序,就是把它扔掉,首先写一个冒泡排序(它会自动稳定)。
  • @abarnet 我很确定他当前的代码是冒泡排序的。 ITEM_MOVE 只是将打印逻辑短路,这可以说是不必要的。
  • @Manny D - 不,这不是冒泡排序。这是一个选择排序,有一大堆不必要的交换。
  • @user2970357 - 在这里听取 abarnert 的建议。冒泡排序本质上是排序稳定的。您需要做的就是正确实现算法 - en.wikipedia.org/wiki/Bubble_sort

标签: python sorting


【解决方案1】:

您现在能做的最好的事情就是了解它为什么要切换这些项目。在每一步打印正在更改的项目。然后你可能会理解这种行为。

所以我尝试了一下,您不会将当前项目与列表中的下一个项目进行比较,而是将当前项目与列表中的所有后续项目进行比较。我在下面所做的更改可能会给您想要的结果。

def bubble_sort_2nd_value(tuples_list):
    NEWLIST = []
    ITEM_MOVE = 0
    for i in tuples_list:
        NEWLIST.append(i)
    for i in range(len(NEWLIST)):
         for j in range(len(NEWLIST)-1):
             k=j+1
             if(NEWLIST[j][1] > NEWLIST[k][1]):
                 ITEM_MOVE = 1
                 NEWLIST[j],NEWLIST[k] = NEWLIST[k],NEWLIST[j]

    if (ITEM_MOVE == 0):
        print(tuples_list)
    else:
        print(NEWLIST)

tuples_list =  [('h2', 8), ('h4', 30), ('h6', 7), ('h8', 54), ('h1', 72), ('h3', 8), ('h5', 7), ('h7', 15), ('h7', 24)]

bubble_sort_2nd_value(tuples_list)

所以你所做的不是 100% 冒泡排序。试试这个,告诉我你是否需要我解释为什么你的不工作。

【讨论】:

  • 对于 tuples_list = [('a', 2), ('b',2), ('c', 1)] 的输入,您的代码返回 [('a', 2), ('b', 2), ('c', 1)]。正确的输出应该是 [('c', 1), ('a', 2), ('b', 2)]
  • 我试了几次,运行良好。您确定您使用的是 (NEWLIST[j][1] > NEWLIST[k][1]) 而不是 (NEWLIST[j][1] compileonline.com/execute_python_online.php
猜你喜欢
  • 2019-05-10
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2011-01-02
  • 2017-07-29
相关资源
最近更新 更多