我的想法: 我正在尝试使用python实现快速排序。 我将第一个元素设置为pivot。 如果左标记的元素大于枢轴,那么我开始移动右标记以找到小于枢轴的元素,然后交换。 如果右标记小于左标记,则用右标记元素交换枢轴。 然后用pivot分隔列表。并重复这一步
问题: 我的代码可以像我想象的那样将列表分成两个列表。但当它返回时,它会以某种方式复制元素几次并使其错误。我不熟悉递归,也找不到问题。
def quick_sort(lst):
front = []
rear = []
temp = 0
pivot = lst[0]
i = 1 #leftmark
j = len(lst)-1 #rightmark
if len(lst) == 1:
return lst
while i<=j:
if lst[i]<pivot:
i+=1
else:
if lst[j]>pivot:
j-=1
elif lst[j] == pivot:
break
else:
temp = lst[i]
lst[i] = lst[j]
lst[j] = temp
'''if j<i (rightmark < leftmark) swap pivot with position j'''
temp = pivot
pivot = lst[j]
lst[j] = temp
lst[0] = pivot
front = lst[0:j+1]
rear = lst[i:len(lst)+1]
return quick_sort(front) + [pivot] + quick_sort(rear)
答案 0 :(得分:0)
您正在将列表切成错误。您应该将lst[i:len(lst)+1]
替换为lst[ j + 1 : ]
,将j
替换为:
,因为数据透视位于from the start
位置,您应该忽略它(此处为{{}}之前的空虚{1}}代表:
,till the end
代表temp
后)。
最后但同样重要的是,考虑使用元组交换而不是temp = a
a = b
b = temp
var,例如:
a, b = b, a
可以用一个衬垫替换
def quick_sort(lst):
if lst:
pivot = lst[0]
i = 1 #leftmark
j = len(lst)-1 #rightmark
if len(lst) == 1:
return lst
while i <= j:
if lst[i] < pivot:
i += 1
elif lst[j]>pivot:
j-=1
elif lst[j] == pivot:
break
else:
lst[i], lst[j] = lst[j], lst[i]
'''if j<i (rightmark < leftmark) swap pivot with position j'''
lst[0], lst[j] = lst[j], lst[0]
front = lst[ : j ]
rear = lst[ j+1 : ]
return quick_sort(front) + [ pivot ] + quick_sort(rear)
return []
这是我的最终工作代码:
>>> quick_sort([1,3,4,2,6,9,0])
[0, 1, 2, 3, 4, 6, 9]
@echo off
Title Multi Ping Tester
set URLS=www.twitter.com www.google.com www.facebook.com
For %%a in (%URLS%) do call :test_ping %%a
Exit /b
::**********************************************************
:test_ping
cls
If Exist %1.txt Del %1.txt
start cmd.exe "/c ping -4 -a %1 >> %1.txt"
Exit /b
::**********************************************************