大道至简——用几行Python代码实现快速排序

本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁。

1. 三言两语概括算法核心思想

先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组。然后对这两个子数组再递归重复上述过程,直到两个子数组的所有数都分别有序。最后返回“左子数组” + “基准数” + “右子数组”,即是最终排序好的数组。

2. Talk is cheap, show the code

# 实现快排
def quicksort(nums):
    if len(nums) <= 1:
        return nums
    
    # 左子数组
    less = []
    # 右子数组
    greater = []
    # 基准数
    base = nums.pop()
    
    # 对原数组进行划分
    for x in nums:
        if x < base:
            less.append(x)
        else:
            greater.append(x)
    
    # 递归调用
    return quicksort(less) + [base] + quicksort(greater)

def main():
    nums = [6,1,2,7,9,3,4,5,10,8]
    print quicksort(nums)

main()

输出:

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

3. 优化

下面充分发挥Python的语法特性对上述过程进行一下优化。

# 导入随机数模块
In [1]: import random

# 查看random.randint函数的文档
In [2]: random.randint?
Signature: random.randint(a, b)
Docstring:
Return random integer in range [a, b], including both end points.

File:      d:\programs\python27\lib\random.py
Type:      instancemethod

# 生成20个在[-10,10]区间上的随机整数,存在nums列表中
In [5]: nums = [random.randint(-10,10) for x in range(20)]

In [6]: nums
Out[6]: [3, 2, -2, 8, 9, -3, 6, 4, -7, 5, 5, 10, 9, -2, 2, 6, -8, 9, -5, 8]

# 定义快速排序函数quick_sort
In [9]: def quick_sort(nums):
   ...:     if len(nums) <= 1:
   ...:         return nums
   ...:     # 随意选取一个基准数,比如选取列表第一个数
   ...:     base = nums[0]
   ...:     # left列表为nums中比基准数base小或等于base的数组成的列表
   ...:     left = [x for x in nums[1:] if x <= base]
   ...:     # right列表为nums中比基准数base大的数组成的列表
   ...:     right = [x for x in nums[1:] if x > base]
   ...:     # 对left和right列表递归排序
   ...:     return quick_sort(left) + [base] + quick_sort(right)
   ...:

# 对nums数组排序
In [10]: print quick_sort(nums)
[-8, -7, -5, -3, -2, -2, 2, 2, 3, 4, 5, 5, 6, 6, 8, 8, 9, 9, 9, 10]

可以看到只用了7行代码就实现了快排算法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,092评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,601评论 0 52
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 6,780评论 0 35
  • 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序...
    EINDEX阅读 4,988评论 5 14
  • 沙漏里的白沙 缓缓地落下 流走的是年华 祭奠一起走过的冬夏 教室窗外的小花 偷听过我们的悄悄话 那一年盛夏 我们吃...
    沧海拾砂阅读 1,796评论 0 0

友情链接更多精彩内容