大体思路是修改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)的快速排序的更多相关文章

  1. Java 递归、尾递归、非递归、栈 处理 三角数问题

    import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## ...

  2. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  3. 将递归函数非递归化的一般方法(cont)

    本文通过模拟汇编里的stack机制,构建一个自己的stack,然后将上一篇blog末尾的递归函数void bst_walk(bst_node_t *root)非递归化. o libstack.h #i ...

  4. 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  5. [Alg] 二叉树的非递归遍历

    1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...

  6. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  7. [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

    本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(pr ...

  8. 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)

    例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...

  9. 数据结构--汉诺塔--借助栈实现非递归---Java

    /*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...

随机推荐

  1. iOS开发安全 架构

    网络通讯.本地文件和数据.源代码三方面 网络通讯 安全的传输用户密码 客户端在登录时,使用公钥将用户的密码加密后,将密文传输到服务器.服务器使用私钥将密码解密,然后加盐 (Salt:在密码学中,是指通 ...

  2. css实现自适应正方形

    这里介绍7种方法,仅供参考. 1.vm单位 <div class="square-shape">这是一个可以自适应的正方形,此法适用于移动端web页面.</div ...

  3. Linux驱动之混杂设备(misc)

    字符设备之混杂设备: 定义混杂设备: struct misdevice{ int minor; //为什么这里只有次设备号,因为混杂设备是一种在 /////////////////////////Li ...

  4. 最新的裸机联想笔记本装win7系统/SSD(固态硬盘)上安装win7系统/联想K4450A i7装win7系统

    老师让我帮他装个操作系统,由于是新电脑,并且老师的电脑上另安有固态硬盘,老师要我把系统安装在固态硬盘上,BIOS是2014年7月份的,所以BIOS设置项可能会有所变化. 下面是遇到的一些问题,及解决方 ...

  5. HNOI 越狱

    题目描述 监狱有连续编号为 1…N的 N 个房间,每个房间关押一个犯人,有 M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱. 输入输出格式 ...

  6. 使用UltraISO制作Windows 10启动U盘

    1.从官方网站下载制作工具UltraISO:http://cn.ultraiso.net/uiso9_cn.exe 这是个试用版,但也足够用一次了. 2.在电脑上插入一块U盘,容量最好不少于8GB,接 ...

  7. 开源的服务发现项目Zookeeper,Doozer,Etcd - 木精灵的技术博客 - CSDN博客

    开源的服务发现项目Zookeeper,Doozer,Etcd - 木精灵的技术博客 - CSDN博客   http://blog.csdn.net/shlazww/article/details/38 ...

  8. LPC1800 and LPC4300 Boot/ISP/CRP

    MCU的启动方式有很多种:UART接口,扩展的静态存储单元(NOR Flash), SPI Flash,quad SPI Flash,高速USB0和USB1.另外可以通过对OTP存储单元的编程. 首先 ...

  9. External Input Counter and External interrupt

    External Input Counter and External interrupt : count the input signal from the button. So what is t ...

  10. Training JTAG Interface

    For most embedded CPU architecture implementations, the JTAG port is used by the debugger to interfa ...