基本快速排序
def quickSort(s, start, end):
if start < end:
index = basicSort(s, start, end)
quickSort(s, start, index - 1)
quickSort(s, index + 1, end)
def basicSort(s, start, end):
"""
基本的快速排序,i作为小于temp值和大于temp值的分界点。index<=i的值都是小于temp的值
index > i 的元素都是大于等于temp的
:param s:
:param start: 闭区间
:param end: 闭区间
:return:
"""
temp = s[start]
j = start
for i in range(start + 1, end + 1):
# 如果i位置的元素小于temp,那就把它放在j+1的位置
if s[i] < temp:
s[j + 1], s[j] = s[i], s[j + 1]
j += 1
# 最后j指向的位置是一个小于temp的元素,可以将其和start位置的元素
s[start], s[j] = s[j], s[start]
return j
二路快速排序
def quickSort(s, start, end):
if start < end:
index = binSort(s, start, end)
quickSort(s, start, index - 1)
quickSort(s, index + 1, end)
def binSort(s, start, end):
"""
:param s:
:param start:
:param end:
:return:
"""
temp = s[start]
i = start + 1
j = end
# 使用的全都是闭区间,闭区间范围[start+1,end]
# 循环终止条件
while True:
# 利用短路条件,如果s[i] < temp在前就会报错
while i <= end and s[i] < temp:
i += 1
while j >= start + 1 and s[j] > temp:
j -= 1
if i >= j:
break
"""
s[i] >= temp 且 s[j] <= temp
所以值等于temp的元素,最终可能分布在两侧
"""
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
s[start], s[j] = s[j], s[start]
return j
三路快速排序
def threeSort(self, s, start, end): # 使用闭区间
"""
:param s:
:param start:
:param end:
:return:
"""
if start > end:
return
temp = s[start]
lt = start # 小于temp的范围是 [start,lt-1]
gt = end + 1 # 等于temp的范围是 [lt+1,gt-1]
i = start + 1 # 大于temp的范围是[gt,r]
# i到gt-1的数据,状态不明确
while i < gt:
if s[i] < temp:
s[i], s[lt + 1] = s[lt + 1], s[i]
lt += 1
i += 1
elif s[i] > temp:
s[i], s[gt - 1] = s[gt - 1], s[i]
gt -= 1
else:
i += 1
s[start], s[lt] = s[lt], s[start]
self.threeSort(s, start, lt - 1)
self.threeSort(s, gt, end)