分区 - 将数组按照一个枢轴(pivot)拆分成两部分,使得较小的元素移动到左边,较大的元素移动到右边或者反之亦然。枢轴可以是数组中的任意元素。为了实现这个算法,我们需要知道数组的起始和结束索引以及枢轴的位置。然后设置两个辅助指针L和R。
所以我们有一个数组user[...,begin,...,end,...]
L和R指针的起始位置
[...,begin,next,...,end,...]
R L
当L < end时,
1. 如果user[pivot] > user[L],则将R向右移动一位并交换user[R]和user[L]
2. 将L向右移动一位
while循环结束后,用user[R]和user[pivot]进行交换。
快速排序 - 使用分区算法,直到由枢轴拆分出来的每个子数组的开始索引都大于或等于结束索引。
def qsort(user, begin, end):
if begin >= end:
return
L = begin+1
R = begin
while L < end:
if user[begin] > user[L]:
R+=1
user[R], user[L] = user[L], user[R]
L+= 1
user[R], user[begin] = user[begin], user[R]
qsort(user, 0, R)
qsort(user, R+1, end)
tests = [
{'sample':[1],'answer':[1]},
{'sample':[3,9],'answer':[3,9]},
{'sample':[1,8,1],'answer':[1,1,8]},
{'sample':[7,5,5,1],'answer':[1,5,5,7]},
{'sample':[4,10,5,9,3],'answer':[3,4,5,9,10]},
{'sample':[6,6,3,8,7,7],'answer':[3,6,6,7,7,8]},
{'sample':[3,6,7,2,4,5,4],'answer':[2,3,4,4,5,6,7]},
{'sample':[1,5,6,1,9,0,7,4],'answer':[0,1,1,4,5,6,7,9]},
{'sample':[0,9,5,2,2,5,8,3,8],'answer':[0,2,2,3,5,5,8,8,9]},
{'sample':[2,5,3,3,2,0,9,0,0,7],'answer':[0,0,0,2,2,3,3,5,7,9]}
]
for test in tests:
sample = test['sample'][:]
answer = test['answer']
qsort(sample,0,len(sample))
print(sample == answer)
my_list = list1 + list2 + ...
。或者将列表解包到新列表中my_list = [*list1, *list2]
。 - Mark Mishyn