用非递归、不用栈的方法,实现原位(in-place)的快速排序
大体思路是修改Partition方法将原本枢数的调整放到方法结束后去做。
这样因为数组右侧第一个大于当前枢数的位置就应该是未划分的子数组的边界。
然后继续进行Partition调整。
这种写法照比递归的写法多出一个向右寻找边界的过程,该过程的平均时间复杂度为Θ(nlogn)。
这样快速排序的算法平均复杂度乘以了常数项2,而空间复杂度缩小到Ο(1)。
private static void QSort(int[] array)
{
int leftLow, leftHeight, rightLow, rightHeight;
int tempLow, tempHeight, key, temp;
leftLow = 0;
leftHeight = leftLow;
rightLow = array.Length - 1;
rightHeight = array.Length - 1;
tempLow = -1; tempHeight = -1; key = -1; while (rightHeight > leftLow)
{ while (leftHeight + 1 < rightLow)
{ key = leftHeight;
tempLow = leftHeight + 1;
tempHeight = rightLow; while (tempLow < tempHeight)
{
while (tempLow < rightHeight && array[tempLow] < array[key])
{
tempLow++;
}
while (leftHeight < tempHeight && array[key] <= array[tempHeight])
{
tempHeight--;
}
if (leftLow < tempHeight && tempLow < rightHeight && tempLow < tempHeight)
{
temp = array[tempLow];
array[tempLow] = array[tempHeight];
array[tempHeight] = temp;
}
}
if (rightHeight == tempHeight && leftHeight ==leftLow )
{
temp = array[rightLow];
array[rightLow] = array[leftHeight];
array[leftHeight] = temp;
rightHeight--;
rightLow--;
continue;
}
rightLow = tempHeight;
if (key == tempHeight)
{
break;
}
else if (key < tempHeight && tempLow > tempHeight)
{
leftHeight++;
} } if (leftHeight != leftLow)
{
if (leftHeight < rightLow)
{
if (array[leftHeight] < array[rightLow])
{
temp = leftHeight;
}
else
{
temp = rightLow;
rightLow++;
leftHeight++;
}
}
else
{
temp = rightLow;
rightLow++;
} key = array[temp];
for (int i = temp; i > leftLow; i--)
{
array[i] = array[i - 1];
}
array[leftLow] = key;
leftLow++; while (rightLow <= rightHeight && array[rightLow] < array[leftHeight])
{
rightLow++;
}
if (rightLow > rightHeight)
{
rightLow--;
} } else
{
rightLow = rightHeight;
leftLow++;
leftHeight++;
} }
if (array[rightHeight] < array[rightHeight - 1])
{
temp = array[rightHeight];
array[rightHeight] = array[rightHeight - 1];
array[rightHeight - 1] = temp;
}
}
用非递归、不用栈的方法,实现原位(in-place)的快速排序的更多相关文章
- Java 递归、尾递归、非递归、栈 处理 三角数问题
import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## ...
- 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...
- 将递归函数非递归化的一般方法(cont)
本文通过模拟汇编里的stack机制,构建一个自己的stack,然后将上一篇blog末尾的递归函数void bst_walk(bst_node_t *root)非递归化. o libstack.h #i ...
- 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- [Alg] 二叉树的非递归遍历
1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...
- 在二叉搜索树(BST)中查找第K个大的结点之非递归实现
一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...
- [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(pr ...
- 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...
- 数据结构--汉诺塔--借助栈实现非递归---Java
/*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...
随机推荐
- Linux驱动之串口(UART)
<uart驱动程序概述> 在嵌入式Linux系统中,串口被看成终端设备,终端设备(tty)的驱动程序分为3部分: tty_core tty_disicipline tty_driver ...
- 解决org.apache.jasper.JasperException: org.apache.jasper.JasperException: XML parsing error on file org.apache.tomcat.util.scan.MergedWebXml
1.解决办法整个项目建立时采用utf-8编码,包括代码.jsp.配置文件 2.并用最新的tomcat7.0.75 相关链接: http://ask.csdn.net/questions/223650
- [POJ1144]Network
来源:Central Europe 1996 思路:Tarjan求割点. 一个点$x$为割点当且仅当: 1.$x$为根结点且有两棵不相交的子树. 2.$x$不为根结点且它的子树中没有可以返回到$x$的 ...
- JAVA初学练手项目,学生管理系统
github地址:https://github.com/qscqesze/StudentManager 简单描述一下: UI层面用于接受用户的处理信息,然后移交给StudentDao去处理数据. 其中 ...
- QQ和微信一键加群加好友代码
QQ和微信一键加群加好友链接代码实现. 1.QQ加群加好友链接(借助腾讯QQ群推广链接和加好友链接实现) (1).加群技术链接: http://qun.qq.com/join.html (2).加好友 ...
- JS funtion()中URL不跳转后台action问题
JS funtion()中URL不跳转后台action问题 今天遇到一个百思不得其解的问题,到现在解决了,但是仍然不知道所以然(估计是因为域名不一致导致的),记录一下 $.get(actionUrl, ...
- POP3_收取QQ邮箱邮件的问题
今天纠结了一天的时间,使用pop3协议收取qq邮箱中邮件时,因为一个特别坑爹的问题重新写n次,最后发现是因为qq邮箱设置了独立邮箱密码,必须的用独立邮箱密码登陆才行,/(ㄒoㄒ)/~~!!!! 但今天 ...
- Versaloon -- Connect To Targets
Versaloon Full open-source(GPLv3) platform for multiple applications, including programmer, debugger ...
- WICED SDK 3.3.1
7/20/2015 UPDATE: After installing the IDE you may not see all the APPs. Press F5 in Eclipse to ref ...
- Linux Shell脚本入门--wc命令
wc 统计文件里面有多少单词,多少行,多少字符. wc语法 [root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行: -w :仅列出多少字(英文单字): -m :多少字符: 默 ...