我有class
名为Graph
来表示连接的无向图,我想实现快速排序,根据边上的权重对边进行排序。
class Graph:
def __init__(self, n):
self.vertices = range(n)
self.edges = set([(random.random(), i, j) for i in xrange(n) for j in xrange(n)])
def qsort(self):
if len(self.edges) <= 1:
return self.edges
else:
return qsort([x for x in self.edges[1:] if x < self.edges[0]]) + [self.edges[0]] + qsort([x for x in self.edges[1:] if x >= self.edges[0]])
graph = Graph(10)
graph.qsort()
当我尝试运行上述内容时,我得到NameError: global name 'qsort' is not defined
。
有人能告诉我我做错了吗?
答案 0 :(得分:1)
您问题的字面答案是您省略了self
关键字:return self.qsort(...) + [self.edges[0]] + self.qsort(...)
。
看起来你正在尝试实现this answer中的3行qsort,这也是Python Cookbook中给出的。您的实现是错误的,因为它应该采用两个参数self
和您正在排序的数组。
不幸的是,没有办法避免传入数组,但有一种可能的解决方法。在方法中添加一个额外的关键字参数:qsort(self, arr = None)
,然后检查数组是否为None
并在这种情况下使用self.edges
。在这种情况下,graph.qsort()
的简洁语法不必改变:
def qsort(self, arr = None):
if arr is None: arr = list(self.edges)
if len(arr) <= 1: return arr
else:
return self.qsort([x for x in arr[1:] if x < arr[0]]) + \
[arr[0]] + \
self.qsort([x for x in arr[1:] if x >= arr[0]])
请注意,因为self.edges
是一个集合,所以qsort方法基本上是无操作,除非您对输出数组执行某些操作。该集不会被改变。