zoukankan      html  css  js  c++  java
  • 准备从头复习算法

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

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

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

    		static void StackQuickSort<T>(T[] array, int start, int end) where T : IComparable<T>{
    			var stack = new Stack<int>();
    			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>(T[] array, int start, int end) where T : IComparable<T>
            {
                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中用栈结构比递归的函数栈调用还要慢呢?

    ——

  • 相关阅读:
    转载
    .gitignore配置(清除缓存)
    Servlet: Servlet接收中文乱码
    Servlet: ServletResponse接口 & HttpServletResponse接口
    Servlet: ServletRequest接口 & HttpServletRequest接口
    Servlet: GET请求 & POST请求
    Servlet: Servlet的概念和使用
    Servlet: Tomcat服务器
    Servlet: HTTP协议
    Servlet:C/S、B/S、JavaWeb的概念
  • 原文地址:https://www.cnblogs.com/XmNotes/p/2941995.html
Copyright © 2011-2022 走看看