快速排序

  快速排序是基于分治策略的一种排序算法,其基本思想是,对输入的子数组a[p:r],按照以下三个步骤进行排序。

1.    分解:以a[p]为基准元素,将a[p:r]分成三段,a[p:q-1],a[q],a[q+1:r],使得a[p:q-1]中的所有元素都小于a[q],a[q+1:r]中的所有元素都大于a[q]

2.    递归求解:通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。

3.    合并:对a[p:q-1]和a[q+1:r]的排序是inplace进行的,所以不需要任何计算,a[p:r]就已经排好了顺序

        今天主要要详述的是,第一个步骤,其他两个步骤都比较简单。而在第一个步骤中详述的就是,函数里面的各个条件。

def quickSort(arr,left,right):
    x=arr[left]
    i=left+1
    j=right
    while True:
        #第一步找到的i是大于arr[0]的索引
        #那为什么要加上个i<len(arr)-1的条件呢?
        #这是由于当数组arr[1:]中所有元素都小于x,这个i会增加到数组以外的索引,造成这个错误:list index out ofrange
        #从而限制了,i最大到数组的最后的索引的位置
        while arr[i]<x and i<len(arr)-1 : i+=1
        #第二步找到的j是小于arr[0]的索引
        #那为什么没有类似于上面的另一个条件呢?
        #这是由于,j压根不会跑到数组索引以外,假如arr[1:]中的所有元素都大于x,那么j会减一直到j=0。因为arr[0]=x
        while arr[j]>x : j-=1
        #在一般的情形下,这个if判断语句其实只要i>j即可,因为如图所示,到最后必然会i>j。
        #那么在什么情形下,会导致i=j呢?
        #当然,那就是在arr[1:]所有元素都小于x
        #这时,i=j,而在这时,循环的后半部分就没必要执行下去了。
        if i>j:break
        temp=arr[i]
        arr[i]=arr[j]
        arr[j]=temp
        i+=1;j-=1
        print('change once:',arr)
    arr[left]=arr[j]
    arr[j]=x
    return j

def sort(arr,left,right):
    if left<right:
        p=quickSort(arr,left,right)
        sort(arr,left,p-1)
        sort(arr, p+1,right)

    在最后,我觉得编程是一个很特别的能力。虽说想法很重要,但是还是需要实践来执行。例如,快速排序的思想起始要是理解了,就真的很简单。但是要编程来实现,其中却要考虑更多的东西,条件是什么?条件为什么是这样?在什么时候停止?例外的情况是什么?,等等。

    当要实践起来,你会发现这个并不像你想象的那么简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值