排序学习笔记(4) - 快速排序的非递归实现

 quick sort的问题,前面说过了:

1,少量数据的排序效果不好,还不如直接插入;

2,对于特殊数据的处理,比如单边递增的有序序列,会出现极端差的情况;

3,数据量大的话,会让栈溢出。

 

所以,有了一些性能提高方案,前面说过:

1,少量数据时候用直接插入;

2,选取pivot用三者的中值;

3,去掉递归,使用栈,或者用数组来仿栈

  1. void qort_no_recursion( T* pTable, UINT start,UINT end) { 
  2.     stack theStack; 
  3.     theStack.push(start); 
  4.     theStack.push(end); 
  5.     while ( !theStack.empty())  { 
  6.         // get the start and end range for sort
  7.         from = theStack.pop();
  8.         to = theStack.pop(); 
  9.         if ( from < to)  { 
  10.             middle = pivot(pTable,from,to); 
  11.             // save the new range: two ranges
  12.             if ( middle > from ) { 
  13.                 theStack.push(from); 
  14.                 theStack.push(middle - 1); 
  15.             } 
  16.             if ( to > middle )  { 
  17.                 theStack.push(middle + 1); 
  18.                 theStack.push(to); 
  19.             } 
  20.         } 
  21.     } 

算法很简单,就是找到一个支点之后,就把两组数据的范围值(from和to)入栈,这样栈里面的数据会逐渐增多;下一次循环只能处理一个range的数据,再次进入两个range。直到进入的逐渐减少,pop的逐渐增多,直到没有。

 

结束

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值