算法 - 快速排序 - python

先看一下这幅图:
这里写图片描述
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

这里的示例是以第一个数为基准点做比较,
以下描述的过程比较粗糙,参考上图和下面代码一起理解更佳;
把整个序列看做一个数组,把第1个位置看做中轴,和最后一个比,如果比它小交换,比它大则往前推一位进行比较,直到直到找到比第1个小的,交换;
交换了以后再和小的那端比,比他大交换,比它小不交换,并往后推一位做比较,直到找到比它大的,交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

/** 
 * 获取中间值[中轴] 
 * @param list 
 * @param low 
 * @param high 
 * @return 
 */  
def get_middle(lst, low, high):
    temp = lst[low] # 数组的第一个作为中轴
    while low < high:
        if (low < high) and (temp <= lst[high]):
            high = high - 1
        lst[low] = lst[high] # 比中轴小的记录移到低端
        if (low < high) and (temp >= lst[low]):
            low = low + 1
        lst[high] = lst[low] # 比中轴大的记录移到高端 
    lst[low] = temp # 中轴记录到尾
    return low # 返回中轴的位置
def quik_sort(lst, low, high):
    if low < high:
        middle = get_middle(lst, low, high)  # 将list数组进行一分为二
        quik_sort(lst, low, middle - 1)  # 对低字表进行递归排序
        quik_sort(lst, middle + 1, high)  # 对高字表进行递归排序

测试

random函数随机取50个数(很可能重复)做排序,如下:

取数
>>> import random
>>> lst = [random.randint(1, 50) for i in range(50)]
>>> lst
[25, 6, 11, 35, 50, 1, 9, 33, 8, 28, 15, 41, 34, 4, 34, 3, 14, 44, 38, 35, 46, 32, 43, 33, 25, 23, 2, 17, 48, 1, 11, 5, 42, 29, 17, 4, 38, 50, 23, 47, 37, 22, 24, 33, 22, 20, 41, 41, 6, 20]
排序
>>> quik_sort(lst, 0, len(lst)-1)
>>> lst
[1, 1, 2, 3, 4, 4, 5, 6, 6, 8, 9, 11, 11, 14, 15, 17, 17, 20, 20, 22, 22, 23, 23, 24, 25, 25, 28, 29, 32, 33, 33, 33, 34, 34, 35, 35, 37, 38, 38, 41, 41, 41, 42, 43, 44, 46, 47, 48, 50, 50]

参考原文并参考评论修改并感谢各位分享

猜你喜欢

转载自blog.csdn.net/wang725/article/details/81544981
今日推荐