连接列表和int

时间:2015-12-28 15:17:08

标签: python list sorting quicksort

我现在正在尝试学习python,而且我遇到了快速排序算法。这是我到目前为止用例子列表写的: [3,1,2,2,1,3,6,7,5,4,8]

def quick(self):
    first = self.lst[0]
    l1 = []
    l2 = []
    for item in self.lst[1:]:
        if item <= first:
            l1.append(item)
            print('this is l1:',l1)
        else:
            l2.append(item)
            print('this is l2:', l2)

        return _____

我尝试self.lst = l1 + first + l2,但是当我这样做时,我收到一条错误消息:

self.lst = l1 + first + l2
builtins.TypeError: can only concatenate list (not "int") to list

我只是想让第一个传递正确,并且可能实现while True until l1 = []或其他东西。

  1. 如何将l1,first和l2连接在一起?
  2. 第一步之后,你们建议我做什么?
  3. 非常感谢!

3 个答案:

答案 0 :(得分:6)

firstint,而l1l2是列表,因此如果您创建的列表[]包含单个项目({{1}然后你可以连接三个列表

first

numerous quicksort algorithms但是如果我们使用例如Lomuto partition scheme维基百科上的伪代码实现

self.lst = l1 + [first] + l2

在Python中,这看起来像

algorithm quicksort(A, lo, hi) is
    if lo < hi then
        p := partition(A, lo, hi)
        quicksort(A, lo, p - 1)
        quicksort(A, p + 1, hi)

algorithm partition(A, lo, hi) is
    pivot := A[hi]
    i := lo        // place for swapping
    for j := lo to hi - 1 do
        if A[j] ≤ pivot then
            swap A[i] with A[j]
            i := i + 1
    swap A[i] with A[hi]
    return i

测试此实现

def quicksort(A, lo, hi):
    if lo < hi:
        p = partition(A, lo, hi)
        quicksort(A, lo, p-1)
        quicksort(A, p+1, hi)

def partition(A, lo, hi):
    pivot = A[hi]
    i = lo
    for j in range(lo, hi):
        if A[j] <= pivot:
            A[i], A[j] = A[j], A[i]
            i += 1
    A[i], A[hi] = A[hi], A[i]
    return i

答案 1 :(得分:0)

quicksort是递归的,所以之前你连接,你应该将l1和l2传递给quick(虽然看起来你正在使它成为一些自定义列表式类的方法,所以你应该制作该类的l1和l2个实例,然后调用l1.quick()),返回l1 + [first] + l2

答案 2 :(得分:0)

科里已经解决了你的第一个问题。至于你的第二个,你需要在开始分区之前检查列表是否至少有一个元素。一旦它被分区,那么你需要在每个NULLl1上进行递归。在连接它们之前,需要对这些子列表进行排序。

您的l2似乎是一种类的方法。当然,如果你愿意,你可以这样做,但这不是必需的。