【发布时间】:2022-01-12 21:19:35
【问题描述】:
在学习选择排序时,我遇到了一种称为宾果排序的变体。根据这个字典条目here,宾果排序是:
选择排序的一种变体,它通过首先找到最小值来对项目进行排序,然后重复地将具有该值的所有项目移动到它们的最终位置,并为下一次遍历找到最小值。
根据上面的定义,我想出了下面的 Python 实现:
def bingo_sort(array, ascending=True):
from operator import lt, gt
def comp(x, y, func):
return func(x, y)
i = 0
while i < len(array):
min_value = array[i]
j = i + 1
for k in range(i + 1, len(array), 1):
if comp(array[k], min_value, (lt if ascending else gt)):
min_value = array[k]
array[i], array[k] = array[k], array[i]
elif array[k] == min_value:
array[j], array[k] = array[k], array[j]
j += 1
i = j
return array
我知道这个实现是有问题的。当我在一个非常小的数组上运行算法时,我得到了一个正确排序的数组。但是,使用更大的数组运行算法会导致数组的排序大多不正确。要在 Python 中复制该问题,可以在以下输入上运行该算法:
test_data = [[randint(0, 101) for i in range(0, 101)],
[uniform(0, 101) for i in range(0, 101)],
["a", "aa", "aaaaaa", "aa", "aaa"],
[5, 5.6],
[3, 2, 4, 1, 5, 6, 7, 8, 9]]
for dataset in test_data:
print(dataset)
print(bingo_sort(dataset, ascending=True, mutation=True))
print("\n")
我一生都无法意识到问题出在哪里,因为我研究这个算法太久了,而且我对这些东西并不精通。除了 2020 年的 an undergraduate graduation project written 之外,我无法在线找到 Bingo Sort 的实现。任何可以为我指明正确方向的帮助将不胜感激。
【问题讨论】: