[英]inplace quick sort implementation
我正在尝试按照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)
的列表,因为因此,我们不仅将跳过列表的最后一个元素(枢纽所在的位置),还将跳过最后一个元素(即right - 2
)。
如果期望在partition
之后,透视点左边的元素应该小于或等于 ,我们应该在遍历array[i] <= pivotValue
过程中将其反映在比较中( array[i] <= pivotValue
)。
使用更少的变量和干净的方法不是更好的方法吗
#!/ usr / bin / python
Array = [1,2,3,4,5,4,3,23,4,5,4,3,2,1,2,3,4,3,4,1,412,2,4]
def swap(a,i,j):
temp=a[i]
a[i]=a[j]
a[j]=temp
def partition(a, left, right):
pivotIndex=right
for i in range(left,right):
if a[i] > a[pivotIndex]:
swap(a,i,pivotIndex)
return pivotIndex
def quicksort(array , left,right):
if left<right:
pivotIndex=partition(array,left,right)
quicksort(array, left, pivotIndex-1)
quicksort(array, pivotIndex+1, right)
def main():
quicksort(Array, 0 , len(Array) -1)
print (Array )
main()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.