Python3实现快速排序
快速排序 是一种交换排序,属于分治算法。
思路:
对于要排序的元素集合,指定集合的第一个元素为基准点,通过一系列的扫描和交换(见下面的代码),让基准点左边的元素比基准点小,让基准点右边的元素比基准点大,这样分成了以基准点为界的左右两个子集合,对于每个子集合递归地重复上述步骤,直到每个最小集合只有一个元素时,就说明每个最小子问题解决完成,从而总问题解决完成。
代码:
# 快速排序 arr要排序的元素总集,left要排序的最左索引,right要排序的最右索引
def kp(arr, left, right):
old_left = left
old_right = right
if left >= right:
return
base = arr[left] # 指定left为基准点,存储基准值
toLeft = True # 扫描方向
while left < right: # 只要left < right,就一直扫描;扫描的结束条件是left和right重合
if toLeft: # 从右向左扫描:若找到比base小的,则把值赋给left处,然后left+1,扫描方向变为向右;否则继续向左扫描(right - 1)
if arr[right] < base:
arr[left] = arr[right]
toLeft = False # 反转扫描方向
left += 1
else:
right -= 1
else: # 从左向右扫描:若找到比base大的,则把值赋给right,然后right-1,扫描方向变为向左;否则继续向右扫描(left + 1)
if arr[left] > base:
arr[right] = arr[left]
toLeft = True # 反转扫描方向
right -= 1
else:
left += 1
arr[left] = base # 把记录的基准值赋值在left和right重合处
# 继续对左右2个子问题进行递归求解,看,这就是分治算法思想(子问题相互独立不重合)
kp(arr, old_left, left - 1)
kp(arr, left + 1, old_right)
if __name__ == '__main__':
arr = [5, 6, 3, 1, 7, 8, 19, 4, 88, -2]
kp(arr, 0, len(arr) - 1)
print(arr)