【问题标题】:Implementation of Quick sort in python and exchanging pivot value在python中实现快速排序并交换枢轴值
【发布时间】:2017-03-12 02:25:40
【问题描述】:

我们知道,在实现快速排序时,我们会选择一个枢轴值。在分区阶段,我们会用右标记交换枢轴值。 这是我的代码:

def quicksort(mylist):
    quicksorthelper(mylist,0,len(mylist)-1)


def quicksorthelper(mylist,first,last):
   if first< last:
      splitpoint=partition(mylist,first,last)
      quicksorthelper(mylist,first,splitpoint-1)
      quicksorthelper(mylist,splitpoint+1,last)

def partition(mylist,first,last):
    pivot= mylist[first]
    leftmark= first +1
    rightmark= last
    done = False
    counter = 0
    while not done:
          while leftmark <= rightmark and mylist[leftmark]< pivot:
                leftmark = leftmark +1
          while leftmark <= rightmark and mylist[rightmark]>pivot:
                rightmark= rightmark -1

          if leftmark>rightmark:
            done = True
          else:
              temp = mylist[leftmark]
              mylist[leftmark]=mylist[rightmark]
              mylist[rightmark]=temp
              counter +=1


    temp= pivot                  #pivot = mylist[first]
    pivot = mylist[rightmark]
    mylist[rightmark]=temp

    return rightmark

mylist= [54,26,93,17,77,31,44,55,20]
quicksort(mylist)
print(mylist)

所以问题是,如果我写了 pivot 而不是 mylist[first],程序就不能工作,而如果我写 mylist[first] 代替 pivot,同时用 rightmark 交换值,它就可以正常工作。你能告诉我为什么会这样吗

另外,如果我尝试做这样的事情: mylist = [54, 26, 93, 17, 77, 31, 44, 55, 20] sortlist=quicksort(mylist) print(sortlist) 然后输出是 None 。不知道有什么问题

【问题讨论】:

    标签: python algorithm python-3.x sorting quicksort


    【解决方案1】:

    这个实现不起作用:

    temp= pivot                  #pivot = mylist[first]
    pivot = mylist[rightmark]
    mylist[rightmark]=temp
    

    因为你不会变异 mylist 当你这样做时

    pivot = mylist[rightmark]
    

    您只是为变量pivot 分配一个新值

    >>> i = 2
    >>> j = 4
    >>> somelist = ['a','b','c','d','e','f','g']
    >>> pivot = somelist[i]
    >>> pivot
    'c'
    >>> temp = pivot
    >>> pivot = somelist[j]
    >>> pivot
    'e'
    >>> somelist[j] = temp
    >>> pivot
    'e'
    >>> somelist
    ['a', 'b', 'c', 'd', 'c', 'f', 'g']
    

    出于同样的原因,执行以下操作不会更改列表:

    >>> anotherlist = [1, 2, 3]
    >>> x = anotherlist[1]
    >>> x
    2
    >>> x = 53
    >>> x
    53
    >>> anotherlist
    [1, 2, 3]
    

    你必须这样做:

    >>> anotherlist[0] = 53
    >>> anotherlist
    [53, 2, 3]
    >>> 
    

    或者你可以使用一个mutator方法。

    最后,您不需要temp 变量来在 Python 中进行交换:

    >>> a = 42
    >>> b = 88
    >>> a,b = b,a
    >>> a
    88
    >>> b
    42
    >>> 
    

    或者用一个列表:

    >>> somelist = ['a','b','c','d','e','f','g']
    >>> i = 2
    >>> j = 4
    >>> somelist[i], somelist[j] = somelist[j], somelist[i]
    >>> somelist
    ['a', 'b', 'e', 'd', 'c', 'f', 'g']
    

    【讨论】:

      【解决方案2】:

      关于您的最后一个问题:快速排序不返回任何内容。这就是sortlist=quicksort(mylist) 将排序列表设置为None 的原因。

      阅读How do I pass a variable by reference? 了解发生了什么。

      【讨论】:

      • 是的,我已经想通了。他们的问题也更多。枢轴价值交换。你知道这里有什么问题吗
      • 我发布的SO问题和答案与价值交换有关。您能否将无法正常工作的更改部分添加到您的问题中?我真的不明白这一点:)
      • 只需查看我的代码中的注释 #pivot = mylist[first] 所以在这三行中,如果我写的是 pivot 而不是 mylist[first],程序将无法运行。虽然我已经在分区函数的开头分配了 pivot = mylist[first]
      • 但是你在这三行中根本没有使用mylist[first] - 我错过了什么?
      • 是的,我没有,这就是程序无法运行的原因。如果我用 mylist[first] 替换 pivot ,该程序将起作用。问题是我知道我的问题的解决方案,唯一我不知道的是为什么会发生这种情况
      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多