在 python 中为快速排序创建分区函数
Creating partition function for Quicksort in python
您好,我无法在 python 中为快速排序创建分区函数。我在许多网站上搜索过,但无法理解发生了什么。我尝试这样做但卡在这里了。
totalElem = input("Enter total Elements: ")
c = 0
unsortElem = [0]*totalElem
low = 0
high = totalElem - 1
# This is to input elements
for c in range(totalElem):
unsortElem[c] = input("Enter Number: ")
c += 1
# The swap function
def swap(elem1, elem2):
k=elem1
elem1 = elem2
elem2 = k
def partition(list, low, high):
left = low
right = high
pivot = (low+high)/2
pivotElem = list[pivot]
while(left<right):
while(list[left]<pivotElem):
left += 1
while(list[right]>pivotElem):
right += 1
if(list[left]>list[right]):
swap(left, right)
#The below prints are just to check if the function is getting correct values.
print list
print pivotElem
print left
print len(list)
partition(unsortElem, low, high)
您的代码中有几个错误 - 首先,您的 right += 1
是错误的,因为正确是最高索引。您需要减少价值,而不是增加价值。其次,为什么要增加 c
输入?您正在使用 range
,因此它会自动执行。此外,您不需要自己的交换函数,因为 Python 可以做到,并且 list
是一种类型,所以您不能那样命名变量。
您要做的是递归地对比您的枢轴更小和更大的元素进行排序。如果你在列表的开头发现比 pivot 更大的元素,你会停止,对于列表末尾的较小元素也是如此,然后你交换值(因为它们在你的列表的坏部分)。如果有更多相同的元素,您还需要注意。您的分区函数不仅仅进行分区,因为您在那里交换元素,它更像是没有递归调用的不正确的快速排序函数。
totalElem = int(raw_input("Enter total Elements: "))
unsortElem = []
# This is to input elements
for c in range(totalElem):
unsortElem.append(int(raw_input("Enter Number: ")))
def qsort(mylist, low, high):
if high - low < 1: # there is less than 2 elements
return
left = low
right = high
pivotElem = mylist[(low + high) / 2]
while left <= right:
while mylist[left] < pivotElem:
left += 1
while mylist[right] > pivotElem:
right -= 1
if left <= right and mylist[left] >= mylist[right]:
mylist[left], mylist[right] = mylist[right], mylist[left]
left += 1
right -= 1
qsort(mylist, low, right)
qsort(mylist, left, high)
qsort(unsortElem, 0, len(unsortElem) - 1)
print unsortElem
您没有提及您使用的是 Python 3 还是 Python 2。如果您想要 Python 3,则已针对 Python 2 进行更正,只需使用 input
而不是 raw_input
和大括号进行打印,例如 print(unsortElem)
.
您好,我无法在 python 中为快速排序创建分区函数。我在许多网站上搜索过,但无法理解发生了什么。我尝试这样做但卡在这里了。
totalElem = input("Enter total Elements: ")
c = 0
unsortElem = [0]*totalElem
low = 0
high = totalElem - 1
# This is to input elements
for c in range(totalElem):
unsortElem[c] = input("Enter Number: ")
c += 1
# The swap function
def swap(elem1, elem2):
k=elem1
elem1 = elem2
elem2 = k
def partition(list, low, high):
left = low
right = high
pivot = (low+high)/2
pivotElem = list[pivot]
while(left<right):
while(list[left]<pivotElem):
left += 1
while(list[right]>pivotElem):
right += 1
if(list[left]>list[right]):
swap(left, right)
#The below prints are just to check if the function is getting correct values.
print list
print pivotElem
print left
print len(list)
partition(unsortElem, low, high)
您的代码中有几个错误 - 首先,您的 right += 1
是错误的,因为正确是最高索引。您需要减少价值,而不是增加价值。其次,为什么要增加 c
输入?您正在使用 range
,因此它会自动执行。此外,您不需要自己的交换函数,因为 Python 可以做到,并且 list
是一种类型,所以您不能那样命名变量。
您要做的是递归地对比您的枢轴更小和更大的元素进行排序。如果你在列表的开头发现比 pivot 更大的元素,你会停止,对于列表末尾的较小元素也是如此,然后你交换值(因为它们在你的列表的坏部分)。如果有更多相同的元素,您还需要注意。您的分区函数不仅仅进行分区,因为您在那里交换元素,它更像是没有递归调用的不正确的快速排序函数。
totalElem = int(raw_input("Enter total Elements: "))
unsortElem = []
# This is to input elements
for c in range(totalElem):
unsortElem.append(int(raw_input("Enter Number: ")))
def qsort(mylist, low, high):
if high - low < 1: # there is less than 2 elements
return
left = low
right = high
pivotElem = mylist[(low + high) / 2]
while left <= right:
while mylist[left] < pivotElem:
left += 1
while mylist[right] > pivotElem:
right -= 1
if left <= right and mylist[left] >= mylist[right]:
mylist[left], mylist[right] = mylist[right], mylist[left]
left += 1
right -= 1
qsort(mylist, low, right)
qsort(mylist, left, high)
qsort(unsortElem, 0, len(unsortElem) - 1)
print unsortElem
您没有提及您使用的是 Python 3 还是 Python 2。如果您想要 Python 3,则已针对 Python 2 进行更正,只需使用 input
而不是 raw_input
和大括号进行打印,例如 print(unsortElem)
.