Python_快速排序

快速排序有三个变量: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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/li_and_li/article/details/80507315