博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
准备从头复习算法
阅读量:7025 次
发布时间:2019-06-28

本文共 1844 字,大约阅读时间需要 6 分钟。

半年多没更新了,太懒了。工作上业务逻辑真是无穷无尽,变更无休无止,还是回来,哪怕随便写点也好。

今天就是个微不足道的东西,不过也有点可以深入思考的东西。

快速排序一般都是递归实现,我一直以为递归性能上差一点,但可读性。但我前几天试写了一个不用递归的快速排序,发现反而不如递归的版本快:

static void StackQuickSort
(T[] array, int start, int end) where T : IComparable
{ var stack = new Stack
(); stack.Push(start);stack.Push(end); int left, right; T pivot; while (stack.Count > 0) { end = right = stack.Pop(); start = left = stack.Pop(); pivot = array[left]; while (true) { while (array[right].CompareTo(pivot) > 0) right--; if (right == left) break; Swap(array, left++, right); while (array[left].CompareTo(pivot) < 0) left++; if (right == left) break; Swap(array, left, right--); } if (left - start > 1) { //如子区间块长大于1,则继续对区间排序 stack.Push(start); stack .Push(left-1); } if (end - left > 1) { stack.Push(left + 1); stack.Push(end); } } }

 时间对比是(ms):

非递归:   80  77  78  77

递归:      73  74  72  71

常规实现代码
internal static void QuickSort
(T[] array, int start, int end) where T : IComparable
{ var left = start; var right = end; var pivot = array[start]; while (true) { while (array[right].CompareTo(pivot) > 0) right--; if (right == left) break; Swap(array, left++, right); while (array[left].CompareTo(pivot) < 0) left++; if (right == left) break; Swap(array, left, right--); } if (left - start > 1) QuickSort(array, start, left - 1); //如子区间块长大于1,则继续对区间排序 if (end - left > 1) QuickSort(array, left + 1, end); }

我想应该,是不是因为.NET中用栈结构比递归的函数栈调用还要慢呢?

——

转载于:https://www.cnblogs.com/XmNotes/archive/2013/03/03/2941995.html

你可能感兴趣的文章
类装载器
查看>>
考勤处理脚本
查看>>
原生的社交分享
查看>>
java 使用相对路径读取文件
查看>>
JAVA向文件中追加内容(转)
查看>>
ecshop数据表说明
查看>>
[leetcode]Valid Sudoku
查看>>
静态成员和实例成员
查看>>
IIS的负载均衡的解决方案
查看>>
有效加快Windows 7运行速度
查看>>
磁盘清理无法删除DUMP文件手工删
查看>>
Java线程:创建与启动
查看>>
.Net开发笔记(八) 动态编译
查看>>
ES配置文件中文版
查看>>
[IE&FireFox]JS兼容
查看>>
欧特克AU中国“大师汇”在线会场 - AU China Virtual上线
查看>>
如何建设高可用系统
查看>>
阿里云计算公司总部开建 2021年竣工
查看>>
Microsoft Store 开发者分成已涨到 95%
查看>>
相对传统桌面设计器,在线报表设计器价值何在?
查看>>