快速排序有三个变量:low(left),hight(right),key(其中left,right代表数组的首尾,是不变值)
low是指向数组左边的指针,hight是指向数组右边的指针,key是比较的基准。在执行快速排序的过程中,首先
- hight从有到左移动,如果low小于hight,而且hight指向的值大于key,那么hight就继续往左移动
- 如果hight指向的数据小于了key,那么就将hight指向的数据和key调换
- 调换过hight指向的数据和key的位置后,low的值从左往右移动
- 当low小于hight,而且low的值小于等于key的时候,low继续向右移动
- 如果low指向的值大于key的值了,那么就将key和low指向的值调换位置
- 只要找到比key大或者比key小的值得时候,就交替移动low和hight
- 如果low和hight相遇,那么就将low和hight相遇的地方左右两边的数组再做以上步骤的排序
- 这次的两组low和hight值分别是(left,low-1)和(low+1,right)
代码如下:
# -*- coding: utf-8 -*-
# @Time : 2018/5/30 9:37
# @Author : li
# @File : quick_sort.py
import random
def quick_sort(array, left, right):
"""
:param array: 待排序数据
:param left: 左边下标
:param right: 右边下标
:return:
"""
if left > right:
return
low = left
hight = right
key = array[low]
while low < hight:
while low < hight and array[hight] > key:
# 只要hight下标的数据比key大,hight就往前走
hight -= 1
array[low] = array[hight]
array[hight] = key
while low < hight and array[low] <= key:
# 只要low的数据比key小或者等于key,low就往后走
low += 1
array[hight] = array[low]
array[low] = key
print(array)
quick_sort(array, left, low-1)
quick_sort(array, low+1, right)
if __name__=="__main__":
array = [random.randrange(10000+i) for i in range(10)]
print("before sort:", array)
quick_sort(array, 0, len(array) - 1)
print("-------快速排序之后的数组 -------")
print(array)
输出结果:
('before sort:', [101, 9182, 8481, 6490, 4417, 6965, 7787, 8955, 5598, 9547])
[101, 9182, 8481, 6490, 4417, 6965, 7787, 8955, 5598, 9547]
[101, 5598, 8481, 6490, 4417, 6965, 7787, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 8481, 6965, 7787, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 8481, 6965, 7787, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 8481, 6965, 7787, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 7787, 6965, 8481, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 6965, 7787, 8481, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 6965, 7787, 8481, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 6965, 7787, 8481, 8955, 9182, 9547]
[101, 4417, 5598, 6490, 6965, 7787, 8481, 8955, 9182, 9547]
-------final-------
[101, 4417, 5598, 6490, 6965, 7787, 8481, 8955, 9182, 9547]
Process finished with exit code 0