微妙的quicksort算法

我从quicksort的基本框架出发,得出了一个比较好理解的代码:   
  1. def qsort_2( a, s, t ):
  2.     if t - s <= 0:
  3.         return
  4.     mid = a[s]
  5.     l = s 
  6.     r = t
  7.     #print a[s:t+1],
  8.     while 1:
  9.         while a[l] < mid and  l < r:
  10.             l += 1
  11.         while a[r] > mid and l < r:
  12.             r -= 1
  13.         
  14.         if l < r:
  15.             a[l], a[r] = a[r], a[l]
  16.             l += 1
  17.             r -= 1
  18.         else:
  19.             break
  20.     
  21.     if a[l] > mid:
  22.         qsort_2( a, s, l-1 )
  23.         qsort_2( a, l, t ) 
  24.     elif a[l] < mid:
  25.         qsort_2( a, s, l )
  26.         qsort_2( a, l+1, t ) 
  27.     else:
  28.         qsort_2( a, s, l-1 )
  29.         qsort_2( a, l+1, t ) 
最后之所有有分支比较,是因为我发现,a[l]是否大于mid是未知的;比较好理解, 但是有的dirty.
查书上的c代码, 用Python写出代码2:
  
  1. def qsort_3( a, s, t ):
  2.     if t - s <= 0:
  3.         return
  4.     mid = a[s]
  5.     l = s + 1
  6.     r = t
  7.     #print a[s:t+1],
  8.     while 1:
  9.         while a[l] < mid and  l < r:
  10.             l += 1
  11.         while a[r] > mid:
  12.             r -= 1
  13.         
  14.         if l < r:
  15.             a[l], a[r] = a[r], a[l]
  16.             l += 1
  17.             r -= 1
  18.         else:
  19.             break
  20.     
  21.     #print 'mid = ', mid, 'a[r] =', a[r], 'a[l] =', a[l],a[s:t+1]
  22.     a[s], a[r] = a[r], a[s]
  23.     qsort_3( a, s, r-1 )
  24.     qsort_3( a, r+1, t ) 

如果改成代码3, 变化仅仅是加上一个条件 l<r,就会出错:
  1. def qsort_3( a, s, t ):
  2.     if t - s <= 0:
  3.         return
  4.     mid = a[s]
  5.     l = s + 1
  6.     r = t
  7.     #print a[s:t+1],
  8.     while 1:
  9.         while a[l] < mid and  l < r:
  10.             l += 1
  11.         while a[r] > mid and l < r:
  12.             r -= 1
  13.         
  14.         if l < r:
  15.             a[l], a[r] = a[r], a[l]
  16.             l += 1
  17.             r -= 1
  18.         else:
  19.             break
  20.     
  21.     #print 'mid = ', mid, 'a[r] =', a[r], 'a[l] =', a[l],a[s:t+1]
  22.     a[s], a[r] = a[r], a[s]
  23.     qsort_3( a, s, r-1 )
  24.     qsort_3( a, r+1, t ) 
    代码2的微妙之处在于while退出时候保证有 a[r] <= mid, 形式上这是由 while a[r] > mid 保障的;而代码3再加上一个条件,破坏了这一个保证。
 
     ps: 有些复杂的算法,不可能一步想到位,有些微妙的地方恐怕还是要通过try-fail来收敛吧.
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值