快速排序:通过多次的比较与交换来完成排序,而这个过程又被分为多次重复单趟排序
算法思想:
1. 在一个无序数组中取一个数key,每一趟排序的最终目的是: 让key左边的所有数都比key小,让key右边的所有数都比key大【假设进行升排序】
也就是说,无论key的左边还是右边是否有序,key都到了它在整个数组有序时,应该在的位置上,对于key来说,他已经有序了, 即每次排序都会固定好一个数
2.接着,再对key的左右区间进行单趟排序,直到每个数都到达它该到的位置上,即整个数组有序
进行一趟快速排序的代码,使用双指针实现的:
def quick_sort(arr, start, end):
if start >= end or start < 0 or end >= len(arr):
return
"""
通过双指针实现快速排序
:param arr: 待排序的数组
:param start: 头指针
:param end: 尾指针
"""
# 记录关键点的下标
key = start
# 若头指针大于等于尾指针则代表循环结束,此时代表着关键点找到了自己的位置
while start < end:
# 此时关键点在数组前列,若关键点的值大于尾指针当前指的值,则进行调换
if key < end and arr[key] > arr[end]:
arr[key], arr[end] = arr[end], arr[key]
# 此时关键点指向end所指向的位置
key = end
# 头指针加一,因为此时头指针之前的包括头指针所指向的数都小于key值
start += 1
if key < end and arr[key] < arr[end]:
end -= 1
# 此时关键点在数组后列,若关键点的值小于头指针当前指的值,则进行调换
if key > start and arr[key] < arr[start]:
arr[key], arr[start] = arr[start], arr[key]
# 此时关键点指向start所指向的位置
key = start
# 尾指针减一,因为此时尾指针之后的包括尾指针所指向的数都大于key值
end -= 1
if key > start and arr[key] > arr[start]:
start += 1
def main():
arr = [5, 56, 67, 2, 56, 25, 3, 65]
quick_sort(arr, 0, len(arr)-1)
print(arr)
if __name__ == '__main__':
main()
运行结果为: