第一篇博客——快速排序

         学的知识比较杂,所以决定如果有时间就写一写,一方面做备忘,一方面激励自己做笔记。

         第一篇博客决定写”快排“。因为“快排”既不是很难的问题,也不是很简单。觉得还算适合做第一篇。

         直接上代码:

def partition(array, p, r ):
    x = array[r]
    i = p - 1
    for j in range(p, r):
        if array[j] <= x:
            i += 1
            temp = array[i]
            array[i] = array[j]
            array[j] = temp
    temp = array[r]
    array[r] = array[i+1]
    array[i+1] = temp
    return i + 1

def QuickSort( array, p, r ):
    if p < r:
        q = partition(array, p, r)
        QuickSort( array, p, q-1 )
        QuickSort( array, p+1, r )

if __name__ == '__main__':
    array = [10, 2, 5, 24, 33, 7, 6, 23, 9, 1]
    length = len(array)
    QuickSort( array, 0, length-1 )
    print array

           

        快排算法时间复杂度是O(nlgn),因为是“分治法”,无数博客都讨论过这个事儿。

        此外,快排的精髓在于partition函数,变量j是顺着数组进行遍历,这样的好处在于符合代码的“空间局部性”,速度会更快。

         当一个内存地址上的数被内存访问,这个数相邻地址的数和要访问的这个数会一起被送到Cache中,下次访问下一个地址的数时,就会被Cache命中,减少了访问内存的时间消耗。

         而且,以linux系统为例,内存一般是需要进行分页管理。为了减少分页索引时延,CPU会有一个“快表”,数据段的空间局部性也会增加“快表”的命中率,从而增加程序运行速度。

 最后,“快排”也是不需要额外的空间。归并排序的merge就需要额外同样数组大小的空间,而快排不需要。


         总之, 快排在算法上既有分治思想的加持,又符合计算机程序运行机制,又不占空间的精妙方法。


 




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值