快排的递归与非递归
2017-11-10 14:33
127 查看
分治类型的算法,一般都存在递归解法和非递归解法两种,对于应用分治思想的快速排序算法,也给出两种实现。
递归:
非递归:利用栈
在一般情况下,非递归比递归响应时间更快,递归在处理问题时要反复调用函数,这增大了它的空间和时间开销。
private static void Partition(int[] a,int low,int high){ if(a===null||low>high||low<0||high<0) return ; int i=low;int j=high;int point=a[low]; while(i<j){ while(i<j&&a[j]>=point) j--; if(i<j) a[i++]=a[j];a[j]=point; while(i<j&&a[i]<=point) i++; if(i<j) a[j--]=a[i];a[i]=point; } return i; }
递归:
public void QuickSort(int[] a,int low,high){ if(a=null||low<0||high<0||low>high) return ; int point=partition(a,low,high); QuickSort(a,low,point-1); QuickSort(a,point+1,high); }
非递归:利用栈
public void QuickSort(int[] a,int low,int high){ if(a=null||low<0||high<0||low>high) return ; Stack<Integer> s=new Stack<>(); s.push(low);s.push(high); while(!s.empty()){ int i=s.peek(); int j=s.peek(); if(i<j){ int k=partition(a,i,j); if(k>i){ s.push(i); s.push(k-1); }else{ s.push(k+1); s.push(j); } } }
在一般情况下,非递归比递归响应时间更快,递归在处理问题时要反复调用函数,这增大了它的空间和时间开销。
相关文章推荐
- 递归和非递归的方法往二叉排序树中插入新的节点
- 深度搜索递归和非递归
- leetcode 108. Convert Sorted Array to Binary Search Tree-数组转搜索树|递归|非递归
- 全排列(含递归和非递归的解法)
- 144. Binary Tree Preorder Traversal――递归,非递归
- codeblocks 树的遍历 递归和非递归
- 递归与非递归的比较
- 二叉树递归与非递归遍历的方法
- 二叉树的递归和非递归
- 【LeetCode】递归和非递归的区别
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树的各种递归和非递归遍历
- 全排列(含递归和非递归的解法)
- 数据结构之二叉树遍历(递归和非递归)
- 笛卡尔积的递归和非递归的实现
- Swap Nodes in Pairs(递归和非递归)
- 二分查找——递归和非递归
- 二叉树遍历,递归,非递归
- [复习] JAVA 遍历目录 (递归调用和非递归)
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)