二维数组的普通冒泡排序 python 问题

longhand bubble sort of 2d array python problem

我有一个从文本文件中取出的数组,数组中是:

[('Sammy', 'sammy@gmail.com', '72'), ('John', 'john@gmail.com', '33'), ('Felix', 'felix@gmail.com', '89'), ('Henry', 'henry@gmail.com', '23'), ('Steven', 'steven@gmail.com', '83'), ('Harry', 'harry@gmail.com', '46'), ('Billy', 'billy@gmail.com', '62'), ('Alex', 'alex@gmail.com', '66'), ('Finn', 'finn@gmail.com', '49')]

在这个二维数组中,我想对数据进行排序,得分最高的数据排在列表顶部,得分最低的数据排在列表底部。该列表名为 sorted_database,低于

我的冒泡排序代码如下(我也想在不使用任何函数的情况下长期使用,例如 .sort):

swapped_database = []
def sortdata():
  swapped = True
  length = len(database)
  print(length)
  temp = 0
  while swapped == True:
    swapped = False

    for index in range(0,length -1,3):
      print(index)
      if database[index] > database[index+1]:
        temp = database[index]
        database[index] = database[index+1]
        database[index + 1] = temp
        swapped = True
  swapped_database.append(database)
  print(swapped_database)
sortdata()

提前致谢

使用 swapped 布尔值和 3 的步骤,这种方法看起来过于复杂。您可以简单地使用双 for 循环。

这是一个 returns 排序列表的工作实现。它使用两个 for 循环进行交换,并根据每个元组中第三个元素的整数值来比较值(而不是直接进行元组比较):

def sortdata(database):
  for iter_idx in range(len(database)):
      for elem_idx in range(len(database) - iter_idx - 1):
          if int(database[elem_idx][2]) > int(database[elem_idx + 1][2]):
              database[elem_idx], database[elem_idx + 1] = \
                  database[elem_idx + 1], database[elem_idx]
  return database

使用示例数据,调用 print(sortdata(database)) 输出:

[[('John', 'john@gmail.com', '33'),
 ('Sammy', 'sammy@gmail.com', '72'),
 ('Felix', 'felix@gmail.com', '89'),
 ('Henry', 'henry@gmail.com', '23'),
 ('Steven', 'steven@gmail.com', '83'),
 ('Harry', 'harry@gmail.com', '46'),
 ('Billy', 'billy@gmail.com', '62'),
 ('Alex', 'alex@gmail.com', '66'),
 ('Finn', 'finn@gmail.com', '49')]]

确保将 database 作为参数传递给函数。第二个 for 循环的上限是 iter_idx 作为 Mushroomator 的建议优化。

存在以下问题:

  • 内部循环不应进行 3 步。元组大小与该元组在 database 列表中的索引无关。 database[index] 值是 元组 ,而不是元组的 成员

  • 比较要看分数。这意味着您应该明确比较元组的 third 元素, 将它们转换为数字——因为它们是字符串。

  • swapped_database在这里没有作用。冒泡排序是一种 inplace 排序算法,因此它使 database 本身排序。此外, swapped_database.append(database) 没有什么意义。它使 database 成为 swapped_database

    中的一个条目

关于代码的一些其他说明:

  • 避免改变全局变量,因此将 database 作为参数传递给您的函数。

  • 在 Python 中,您不需要 temp 变量来交换值。请改用元组赋值。

  • while swapped == True 太过分了,因为 swapped 已经是一个布尔值,所以只需 while swapped

def sortdata(database):
  swapped = True
  length = len(database)
  while swapped == True:
    swapped = False
    for index in range(0,length -1):
      if int(database[index][2]) < int(database[index+1][2]):
        database[index], database[index+1] = database[index+1], database[index]
        swapped = True

使用示例:

sortdata(database)
for entry in database:
    print(entry)