python - 就地快速排序实现

标签 python algorithm data-structures

我正在尝试按照 http://en.wikipedia.org/wiki/Quicksort 中的说明实现就地快速排序

下面是 python 代码,分区函数没有按预期工作。

def swap(array, index1, index2):
    tmp = array[index1]
    array[index1] = array[index2]
    array[index2] = tmp

def partition(array, left, right, pivotIndex):
    pivotValue = array[pivotIndex]
    swap(array, pivotIndex, right)
    storeIndex = left
    for i in range(left, right - 1):
        if array[i] < pivotValue:
            swap(array, i, storeIndex)
            storeIndex = storeIndex + 1
            print array, i
    swap(array, storeIndex, right)
    return storeIndex

def quicksort(array, left ,right):
    if right > left:
        print left, right
        pivotIndex = left
        pivotNewIndex = partition(array, left, right, pivotIndex)
        quicksort(array, left, pivotNewIndex - 1)
        quicksort(array, pivotNewIndex + 1, right)

if __name__ == '__main__':
    array = [3,7,8,5,2,1,9,5,4]
    partition(array, 0, len(array) - 1, 3) # 5 is pivot
    print array # expecting all the elements to the left of pivot value(5) will be lesser or equal.

最佳答案

您至少需要进行 2 次修复:

def partition(array, left, right, pivotIndex):
    pivotValue = array[pivotIndex]
    swap(array, pivotIndex, right)
    storeIndex = left
    for i in range(left, right):    # range doesn't include right element already
        if array[i] <= pivotValue:  # need to check for equality (not really necessary for the sorting routine)
            swap(array, i, storeIndex)
            storeIndex = storeIndex + 1
            print array, i
    swap(array, storeIndex, right)
    return storeIndex

range(left, right)返回这样的项目列表 [left, left + 1, ..., right - 1] , 因此无需使用 range(left, right -1) 生成列表,因为这样我们不仅要跳过列表的最后一个元素(pivot 所在的位置),还要跳过最后一个元素(即 right - 2 )。

如果预计在partition之后pivot 左边的元素应该小于或等于,我们应该在数组遍历(array[i] <= pivotValue)的比较中反射(reflect)它。

关于python - 就地快速排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148093/

相关文章:

algorithm - 当某物是 Big O 时,是否意味着它正是 Big O 的结果?

java - 在java中使用链表乘多项式

c++ - C/C++ 中的 BST super 节点生成

python - 将 CSV 数据制作为字符串列表 Python

algorithm - 如何将二维点划分为间隔(仅使用垂直线)?

python - xlrd 单元格的原始值

在基于图 block 的游戏中描述攻击范围的算法

java - Java中的无序对

python - 在第二台显示器中显示新窗口,opencv

python - openpyxl:将一系列数字读取到数组的更好方法