快排

快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。

本文用python语言介绍四种不同的快排实现。

1. 一行代码实现的简洁版本

[python]  view plain  copy
  1. quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])  
  2.       

2. 网上常见的快排实现

[python]  view plain  copy
  1. def quick_sort(array, left, right):  
  2.     if left >= right:  
  3.         return  
  4.     low = left  
  5.     high = right  
  6.     key = array[low]  
  7.     while left < right:  
  8.         while left < right and array[right] > key:  
  9.             right -= 1  
  10.         array[left] = array[right]  
  11.         while left < right and array[left] <= key:  
  12.             left += 1  
  13.         array[right] = array[left]  
  14.     array[right] = key  
  15.     quick_sort(array, low, left - 1)  
  16.     quick_sort(array, left + 1, high)  

由于快排是原地排序,因此不需要返回array。

array如果是个列表的话,可以通过len(array)求得长度,但是后边递归调用的时候必须使用分片,而分片执行的原列表的复制操作,这样就达不到原地排序的目的了,所以还是要传上边界和下边界的。

3.《算法导论》中的快排程序

[python]  view plain  copy
  1. def quick_sort(array, l, r):  
  2.     if l < r:  
  3.         q = partition(array, l, r)  
  4.         quick_sort(array, l, q - 1)  
  5.         quick_sort(array, q + 1, r)  
  6.   
  7. def partition(array, l, r):  
  8.     x = array[r]  
  9.     i = l - 1  
  10.     for j in range(l, r):  
  11.         if array[j] <= x:  
  12.             i += 1  
  13.             array[i], array[j] = array[j], array[i]  
  14.     array[i + 1], array[r] = array[r], array[i+1]  
  15.     return i + 1  

这个版本跟上个版本的不同在于分片过程不同,只用了一层循环,并且一趟就完成分片,相比之下代码要简洁的多了。

4. 用栈实现非递归的快排程序

先说两句题外话,一般意义上的栈有两层含义,一层是后进先出的数据结构栈,一层是指函数的内存栈,归根结底,函数的内存栈的结构就是一个后进先出的栈。汇编代码中,调用一个函数的时候,修改的也是堆栈指针寄存器ESP,该寄存器保存的是函数局部栈的栈顶,另外一个寄存器EBP保存的是栈底。不知道与栈存储空间相对的堆存储空间,其组织结构是否也是一个完全二叉树呢?

高级语言将递归转换为迭代,用的也是栈,需要考虑两个问题:

1)栈里边保存什么?

2)迭代结束的条件是什么?

栈里边保存的当然是需要迭代的函数参数,结束条件也是跟需要迭代的参数有关。对于快速排序来说,迭代的参数是数组的上边界low和下边界high,迭代结束的条件是low == high。

[python]  view plain  copy
  1. def quick_sort(array, l, r):  
  2.     if l >= r:  
  3.         return  
  4.     stack = []  
  5.     stack.append(l)  
  6.     stack.append(r)  
  7.     while stack:  
  8.         low = stack.pop(0)  
  9.         high = stack.pop(0)  
  10.         if high - low <= 0:  
  11.             continue  
  12.         x = array[high]  
  13.         i = low - 1  
  14.         for j in range(low, high):  
  15.             if array[j] <= x:  
  16.                 i += 1  
  17.                 array[i], array[j] = array[j], array[i]  
  18.         array[i + 1], array[high] = array[high], array[i + 1]  
  19.         stack.extend([low, i, i + 2, high])  
另外,当数组下标为-1时,C++、Java等语言中会报错,但python中访问的是最后一个元素,所以如果程序写错了,可能其他语言会报错,但python会输出一个错误的结果。

转自:https://blog.csdn.net/razor87/article/details/71155518

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值