1.教科書上使用迭代的方法進行快速排序,原则上所有的迭代都可以用自定义栈来转换为非迭代算法。

假如最少两个构成一段, 当前的分段个数一定不会超过length/2.
用两个数组表示各个分段:
int[] low = new int[length/2];
int[] high = new int[length/2];

每次循环只拆分栈顶的那个分段,用index 变量记录栈顶,并加入第一个根分段:

int index = 0;
low[index] = 0;
high[index] = values.length - 1;

然后使用while循环
while (index >= 0) {
int plow = low[index];
int phigh = high[index];
int pivoit = low[index];
int pivoitVluae = values[pivoit];

Onetimequicksort();
}

package interview;

public class QuickSortNotRecursive {

 public static void main(String[] args) {      int[] values = new int[] {               7, 13, 4, 246     };        quickSort(values.length, values);     for(int i = 0; i < values.length; ++ i) {           System.out.println(values[i]);        } }

   public static void quickSort(int length, int[] values) {      int[] low = new int[length];     int[] high = new int[length];        int index = 0;       low[index] = 0;      high[index] = values.length - 1;     while (index >= 0) {          int plow = low[index];           int phigh = high[index];         int pivoit = low[index];         int pivoitVluae = values[pivoit];            while (plow < phigh) {             while (plow <= phigh) {                   if (values[phigh] >= pivoitVluae) {                       values[pivoit] = values[phigh];                      pivoit = phigh;                      phigh --;                     break;                    }else {                       phigh --;                 }             }             while (plow <= phigh) {                   if (values[plow] < pivoitVluae) {                      values[pivoit] = values[plow];                       pivoit = plow;                       plow++;                     break;                    }else {                       plow ++;                    }             }         }         values[pivoit] = pivoitVluae;

          int topLow = low[index];         int topHigh = high[index];           index--;          if (pivoit - 1 > topLow) {             index++;                low[index] = topLow;             high[index] = pivoit - 1;            }         if (pivoit + 1 < topHigh) {               index++;                low[index] = pivoit + 1;                high[index] = topHigh;           }     } }}

经过测试,工作正常。

采用教科书的更优化的一趟快速排序

   public static void quickSort2(int length, int[] values) {     if (values.length < 2) {           return;       }     int[] low = new int[(length) / 2];       int[] high = new int[(length) / 2];      int topIndex = 0;        low[topIndex] = 0;       high[topIndex] = values.length - 1;      while (topIndex >= 0) {           int plow = low[topIndex];            int phigh = high[topIndex];          int pivoitVluae = values[plow];

            while (plow < phigh) {             while (plow < phigh) {                 if (values[phigh] > pivoitVluae) {                     values[plow] = values[phigh];                        break;                    } else {                      phigh--;                  }             }             while (plow < phigh) {                 if (values[plow] < pivoitVluae) {                      values[phigh] = values[plow];                        break;                    } else {                      plow++;                 }             }         }         values[plow] = pivoitVluae;

            int topLow = low[topIndex];          int topHigh = high[topIndex];            topIndex--;           if (plow - 1 > topLow) {               topIndex++;             low[topIndex] = topLow;              high[topIndex] = plow - 1;           }         if (plow + 1 < topHigh) {             topIndex++;             low[topIndex] = plow + 1;               high[topIndex] = topHigh;            }     } }

面试题目之 ----使用非迭代方法快速排序相关推荐

  1. 快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

    [c++]代码库#include using namespace std; #include using namespace std; typedef int KeyType; struct LEle ...

  2. JAVA工程师面试题目大全_绝对值得看

    JAVA工程师面试题目大全 一.单选题 1.下列哪种说法是正确的( D) A)实例方法可直接调用超类的实例方法 B)实例方法可直接调用超类的类方法 C)实例方法可直接调用其他类的实例方法 D)实例方法 ...

  3. 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

    0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比 ...

  4. C/C++面试题目汇总

    C/C++面试题目汇总 最近因为找工作,收集了很多C语言方面方面的面试题以及答案.现在新工作搞定了,决定把这些资料发出来,送给有需要的朋友,免得再象我一样到处搜寻,实在辛苦. 发布之前先申明两点:   ...

  5. 给即将在今年九十月份找工作立志从事java开发的同学分享一下常见的面试题目!

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  6. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)

    Android面试题目 Java 基础 int占用几个字节 讲一下常见编码方式? UTF-8编码下中文占几个字节 int和Interger的区别 int.char.long各占多少字节数 string ...

  7. 【面试】网易游戏面试题目整理及答案(5)

    网易游戏面试题目整理及答案(5) 算法 操作系统 Linux部分 其他 参考资料 算法 Leetcode 75题:请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 1)每一行 ...

  8. C语言经典面试题目(转的,不过写的的确好!)

    第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一 ...

  9. pythonweb面试常见问题_python和web框架面试题目整理(3)

    1.django为什么需要缓存,有几种缓存方式? 答:由于Django是动态网站,部分请求均会去数据库进行相应的操作,当程序的访问量大时,耗时必然会更加明显,最简单解决方式是使用缓存提高读请求的处理效 ...

最新文章

  1. 2010-12-30
  2. 小米输掉官司,倒打一耙不如坦然认错
  3. 背包问题九讲 v1.0
  4. php h5用户信息,【php】PHP怎样防止用户注册高仿其他人的用户名?
  5. 【LeetCode 169】Majority Element
  6. HD 1003 Max Sum(贪心)
  7. php poi,GitHub - satthi/poi-php: poi-php
  8. 东半球最全的 postman 使用教程
  9. ASP.NET面试题 (转)
  10. DIY协同办公平台(C/S)系列3之内部邮箱篇
  11. 【如何制作电子书】云展网教程 | 编辑纯文本阅读页面功能(有利于SEO收录)
  12. 安装.NET Framework 4,一直停留在正在安装 .NET Framework 4 Client Profile
  13. linux命令大全密码修改,linux修改密码命令
  14. springboot基于安卓的移动数字图书馆的设计与实现毕业设计源码030911
  15. JDK 1.4 中打印,
  16. 怎样才能压缩PDF文件大小
  17. 软件框架技术1(MyBatis)
  18. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——8 - The Highs of Low Technology(“低”科技的优点)
  19. 在ipad任意界面都可以写字_用iPad (含pencil)作医学生的学习工具使用技巧分享第三集...
  20. 同济弱鸡21考研逆袭之路(四)

热门文章

  1. c语言的多文件组织,c++中多文件的组织
  2. resin如何部署java项目_resin项目换成tomcat部署的两种方式
  3. 上传附件每次都是上传中。_起标题头疼?每次卡在标题上 我都回顾这7种方法 创作灵感就来了...
  4. python编写赛车游戏单机版_使用Keras和DDPG玩赛车游戏(自动驾驶)
  5. Git 2.18版本发布:支持Git协议v2,提升性能
  6. Map集合遍历的四种方式理解和简单使用
  7. 这才是我想要的云盘工具
  8. Theano - Numpy 新手
  9. 你需要知道的Android View的布局
  10. 【PHP】微信官方代码Log调试输出类,面向对象设计模式!来看看,你会有收益!...