在python中为Quicksort创建分区函数

时间:2015-05-05 20:41:54

标签: python quicksort

您好我无法在python中为quicksort创建分区函数。我在许多网站上搜索过,但我无法理解发生了什么。我试图这样做,但我被困在这里。

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)

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误 - 首先,您的right += 1是错误的,因为右边是最高的索引。你需要减少价值,而不是增加。其次,为什么你在输入中增加c?您正在使用range,因此它会自动执行。此外,您不需要自己的交换功能,因为Python可以执行此操作,并且list是一种类型,因此您无法像这样命名您的变量。

您要做的是递归地对比您的数据透镜更小和更大的元素进行排序。如果您在列表的开头找到比枢轴更大的元素,则停止,对于列表末尾的较小元素,相同,然后交换值(因为它们位于列表的坏部分)。如果有更多相同的元素,您还需要注意。您的分区功能不仅仅进行分区,因为您在那里交换元素,它更像是在没有递归调用的情况下不能正确的快速排序功能。

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 2,如果您希望将其用于Python 3,则只需使用input代替raw_input和用于打印的大括号,例如print(unsortElem)