Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 快速排序算法的实现_Python - Fatal编程技术网

Python 快速排序算法的实现

Python 快速排序算法的实现,python,Python,这是一个快速排序实现的摘录。但是,它使用第一项作为轴心,我需要它能够在使用第一项和最后一项之间交换。我该怎么做呢?(将pivot\u pointer=list[start]更改为pivot\u pointer=list[end]将输出未排序的数据。) 谢谢 def recursive_split(list, start, end): if start < end: split = qsortpartition(list, start, end) recur

这是一个快速排序实现的摘录。但是,它使用第一项作为轴心,我需要它能够在使用第一项和最后一项之间交换。我该怎么做呢?(将pivot\u pointer=list[start]更改为pivot\u pointer=list[end]将输出未排序的数据。)

谢谢

def recursive_split(list, start, end):
   if start < end:
       split = qsortpartition(list, start, end)
       recursive_split(list, start, split - 1)
       recursive_split(list, split + 1, end)


def qsortpartition(list, start, end):
    left_pointer = start + 1
    right_pointer = end
    pivot_pointer = list[start]

    while not pointers_converged:
        while left_pointer <= right_pointer and \
            list[left_pointer] >= pivot_pointer:

            left_pointer += 1

        while list[right_pointer] <= pivot_pointer and \
            right_pointer >= left_pointer:

            right_pointer -= 1

        if right_pointer < left_pointer:
            pointers_converged = True

        else:
            list = switch(list, left_pointer, right_pointer)

    list = switch(list, start, right_pointer)

    return right_pointer
def递归_分割(列表、开始、结束):
如果开始<结束:
split=qsortpartition(列表、开始、结束)
递归分割(列表、开始、分割-1)
递归分割(列表,分割+1,结束)
def qsortpartition(列表、开始、结束):
左指针=开始+1
右指针=结束
枢轴指针=列表[开始]
虽然指针不收敛:
当左指针=枢轴指针时:
左指针+=1
列表[右指针]=左指针时:
右_指针-=1
如果右指针<左指针:
指针_收敛=真
其他:
列表=开关(列表、左指针、右指针)
列表=开关(列表、开始、右指针)
返回右箭头

有趣的实现

我对它做了一些更改,我将在下面展示:

在助手函数中:

   helper(alist, start, split - 1)
   helper(alist, split + 1, end)
left = start + 1
right = end
pivot = alist[start]
致:

这是由于返回的分区也将更改:

在配分函数中:

   helper(alist, start, split - 1)
   helper(alist, split + 1, end)
left = start + 1
right = end
pivot = alist[start]
致:

致:

完整模块代码:

def qsort(alist):
    helper(alist, 0, len(counts) - 1)

def helper(alist, start, end):
   if start < end:
       split = partition(alist, start, end)
       helper(alist, start, split - 1)
       helper(alist, split + 1, end)

def partition(alist, start, end):
    left = start
    right = end - 1
    pivot = alist[end]

    while True:
        while left <= right and \
            alist[left] >= pivot:
            left += 1
        while alist[right] <= pivot and \
            right >= left:
            right -= 1
        if right < left:
            break
        else:
            alist = switch(alist, left, right)
    alist = switch(alist, left, end)
    return left

def switch(alist, x, y):
    temp = alist[x]
    alist[x] = alist[y]
    alist[y] = temp
    return alist
def qsort(列表):
助手(列表、0、len(计数)-1)
def辅助程序(列表、开始、结束):
如果开始<结束:
拆分=分区(列表、开始、结束)
助手(列表、开始、拆分-1)
辅助对象(列表,拆分+1,结束)
def分区(列表、开始、结束):
左=开始
右=结束-1
pivot=alist[结束]
尽管如此:
左=枢轴时:
左+=1
而alist[右]=左:
右-=1
如果右<左:
打破
其他:
alist=开关(alist,左,右)
alist=开关(alist,左,端)
左转
def开关(左、右、右):
温度=零[x]
alist[x]=alist[y]
alist[y]=温度
返回列表

要使用最后一项作为轴心元素,只需将第一个元素与最后一个元素交换,然后 照常继续:

def partition(alist, start, end):
    left = start + 1
    right = end
    switch(alist,start,end)
    pivot = alist[start]
def qsort(alist):
    helper(alist, 0, len(counts) - 1)

def helper(alist, start, end):
   if start < end:
       split = partition(alist, start, end)
       helper(alist, start, split - 1)
       helper(alist, split + 1, end)

def partition(alist, start, end):
    left = start
    right = end - 1
    pivot = alist[end]

    while True:
        while left <= right and \
            alist[left] >= pivot:
            left += 1
        while alist[right] <= pivot and \
            right >= left:
            right -= 1
        if right < left:
            break
        else:
            alist = switch(alist, left, right)
    alist = switch(alist, left, end)
    return left

def switch(alist, x, y):
    temp = alist[x]
    alist[x] = alist[y]
    alist[y] = temp
    return alist
def partition(alist, start, end):
    left = start + 1
    right = end
    switch(alist,start,end)
    pivot = alist[start]