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