(-1)写在前面

在一次面试中被问及快速排序,回来后又看了一次以前做过的案例,说来惭愧,时至今日还需要读好长时间,才能明白自己代码的意思,主要是缺少注释和图解,深有感慨,决定好好记录一下。

之所以使用二叉树,是因为用递归实现当数据量过大时会报栈溢出的错误,我试了一下别人的电脑也是这个问题。当然使用二叉树也会报内存不足,原因是无法创建那么长的数组,堆区内存溢出。个人感觉要比递归实现好的多。

(0)算法详解

程序随机产生数据,将其放在数组里。

a.将最小索引到最大索引之间的数据看做一个整体,程序已最小索引代表的数A为准

b.调换A的位置,使得A左边是比A大的数,A右边是比A小的数,此时A的索引被称为中间索引

c.最小索引到  中间索引-1被看为左孩子 ,中间索引+1 到最大索引被看做右孩子

已此图为例,说明程序流程:

每个节点代表一个数组片段,1是根节点,代表整个数组,每个片段都要经历a、b的操作

顺序为操作1,创建2,3,操作2,创建4,5,操作4,回到2,操作5,回到2,回到1,操作3,创建6,操作6,回到3,回到1,完事。

以下面这个数组为例,说明程序流程

int[] oop = {510, 107,948, 659, 955,438, 283,822};

第一次

a 步骤  最小索引0,最大索引7  A –>510

b步骤  [822, 955, 948, 659, 510, 438, 283, 107]

c  步骤 左孩子0-3  右孩子5-7

第二次

a 步骤  最小索引0,最大索引3  A –>822

b步骤  [948, 955, 822,659]

c  步骤 左孩子0-1  右孩子没有

第三次

a 步骤  最小索引0,最大索引1  A –>948

b步骤  [955, 948]

c  步骤 左孩子没有、  右孩子没有

第四次

a 步骤  最小索引5,最大索引7  A –>438

b步骤[438, 283, 107]

c  步骤 左孩子没有、, 右孩子6-7

第五次

a 步骤  最小索引6,最大索引7  A –>283

b步骤[283, 107]

c  步骤 左孩子没有、  右孩子没有

(2)具体实现

class Test

{

public static void main(String[] args)

{

int len = 8000000;

int[] oop = new int[len];

for(int i=0;i

oop[i] = (int)(Math.random()*1000);

Calendar c1 = Calendar.getInstance();

Sort.quick_sort(oop);

Calendar c2 = Calendar.getInstance();

System.out.println(c2.getTimeInMillis()-c1.getTimeInMillis());

}

}

class Binary

{

private int left,//最小索引

right;//最大索引

private Binary beforeBinary,//父节点

rightBinary,//左孩子

leftBinary;//右孩子

public Binary(int left,int right)

{

this.left= left;

this.right = right;

}

public void setLeft(int left)

{

this.left = left;

}

public void setRight(int right)

{

this.right = right;

}

public void setBefore(Binary beforeBinary)

{

this.beforeBinary = beforeBinary;

}

public void setRightBinary(Binary rightBinary)

{

this.rightBinary = rightBinary;

}

public void setLeftBinary(Binary leftBinary)

{

this.leftBinary = leftBinary;

}

public int getLeft()

{

return this.left;

}

public int getRight()

{

return this.right;

}

public Binary getBeforeBinary()

{

return this.beforeBinary;

}

public Binary getRightBinary()

{

return this.rightBinary;

}

public Binary getLeftBinary()

{

return this.leftBinary;

}

}

class Sort

{

public static void quick_sort(int[] oop)

{

Binary headBinary = new Binary(0,oop.length-1),

tempBinary  = headBinary;

int right,

left,

tempNumber;

boolean flag = true;

headBinary.setBefore(null);

do

{

left = tempBinary.getLeft();

right = tempBinary.getRight();

tempNumber = oop[left];

while(left

{

while(left=oop[right])//从右边找到比tempNumber大的数

right--;

if(left

{

oop[left] = oop[right];//将右边的数赋值给左边的

left++;//缩减范围

}

while(left

left++;

if(left

{

oop[right] = oop[left];//将左边的数赋值给右边

right--;//缩减范围

}

}

//此时left==right

oop[left] = tempNumber;

if(right

{

Binary c1 = new Binary(right+1,tempBinary.getRight());

tempBinary.setRightBinary(c1);

c1.setBefore(tempBinary);

}

if(left-1>tempBinary.getLeft()) //创建右孩子

{

Binary c1 = new Binary(tempBinary.getLeft(),left-1);

tempBinary.setLeftBinary(c1);

c1.setBefore(tempBinary);

}

flag = true;

do//操作A:(遍历左孩子、右孩子,如果左孩子、右孩子都被遍历,返回上次节点)重复A操作,直到遍历到跟节点

{

if(tempBinary.getLeftBinary() != null)//如果左孩子被创建了,就先遍历左孩子

{

Binary c1 = tempBinary.getLeftBinary();;

tempBinary.setLeftBinary(null);//最为重要,只要被遍历的左孩子就将起在上层节点的引用设为null,

tempBinary = c1;

flag = false;

}

else if(tempBinary.getRightBinary() != null)//右孩子总是左兄弟节点遍历后才被遍历

{

Binary c1 = tempBinary.getRightBinary();

tempBinary.setRightBinary(null);

tempBinary = c1;

flag = false;

}

else //左孩子。右孩子都被遍历返回父节点

{

if(tempBinary == headBinary) break;

tempBinary = tempBinary.getBeforeBinary();

}

}while(flag);

}while(tempBinary != headBinary);//当回溯到根节点时,说明排序完毕

}

}

(3)简单测试

80000000 内存溢出

8000000 66607ms

800000 1027ms

java炫酷龙卷风源码_Java-使用二叉树实现快速排序-遁地龙卷风相关推荐

  1. java炫酷龙卷风源码,PS合成超炫的炸裂龙卷风场景

    7.下面将利用图层蒙版隐藏多余的闪电图像.单击添加图层蒙版按钮为"图层1"添加图层蒙版,设置前景色为黑色,选择画笔工具并设置适当的画笔大小及不透明度,在多余的闪电图像上涂抹以将其隐 ...

  2. java代码实现龙卷风_Java-使用二叉树实现快速排序-遁地龙卷风

    (-1)写在前面 在一次面试中被问及快速排序,回来后又看了一次以前做过的案例,说来惭愧,时至今日还需要读好长时间,才能明白自己代码的意思,主要是缺少注释和图解,深有感慨,决定好好记录一下. 之所以使用 ...

  3. java短信接口源码_java免费短信接口开发源码

    java免费短信接口开发源码 更多 作者:捷信通来源:www.jiexintong.cn日期:2014-07-30 17:08:51 微宏捷信通短信接口提供适应C#.Java..NET等多种主流开发语 ...

  4. java在线学习系统源码_java学习成长之路(基础,源码,项目,实战)

    获取一下学习资源请关注微信公众号:Java编程指南 我为自学编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么疑问 ...

  5. java期末考试卷及答案_java期末考试试卷及答案1

    本科java程序设计期末考试试卷 <Java 程序设计>期末考试试卷 第 1 页 共 9 页 学年 学期期末考试卷 卷 课程 <Java 程序设计> 考试时间: 120 分钟 ...

  6. java微信支付接口源码_java微信支付源码(WxPayAPI_JAVA_v3)

    [实例简介] [实例截图] [核心代码] package com.github.wxpay.sdk; import java.util.HashMap; import java.util.Map; i ...

  7. java手机小游戏源码_Java手机版数独小游戏(J2me)JAVA游戏源码下载

    数独游戏,相信朋友们都知道的,以前也经常玩的,用VB.VC++和Delphi版编写的都在网上宣布过,今天放出一个鉴于Java的J2me手机版的,大致看一下截图,这是在Java模拟机运行的界面,带有Ja ...

  8. java sso单点登录源码_Java单点登录系统 sso源码下载

    这是一个使用Java开发的单点登陆系统(sso). 运行截图 单点登陆介绍 单点登录,这就是我们通常称之为SSO.一般来说,大型系统平台将使用这些东西.它解决了频繁登录和验证的过程,即用户的一次登录被 ...

  9. java ftp下载文件源码_java实现ftp文件下载的源代码

    这几天做的一个项目中用到了ftp文件传输,用java实现了ftp文件的下载. 一.win7下搭建ftp服务器 详见:http://jingyan.baidu.com/article/4b52d7026 ...

最新文章

  1. 成本预算的四个步骤_干货!如何做好年度培训计划中的预算工作
  2. 附加到IIS进程调试页面
  3. mvvm绑定checkbox wpf_wpf中使用mvvm,解决checkbox全选问题
  4. 华为服务器芯片总在pc,服务器芯片 华为
  5. 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
  6. css圆角box(宽度自适应)(百度知道挖出)
  7. max31865C语言程序,max31865温度传感器通信驱动代码
  8. HTML实现W3school导航栏(附带重置样式表reset.css)
  9. 数字频率计的Verilog设计
  10. ssl证书下载与安装 – 如何下载ssl证书
  11. python与爬虫-02复杂的HTML解析
  12. 北航计算机学院本科优秀毕业论文,北航本科毕业论文
  13. sql server复习 练习
  14. 30 个 Python3 的最佳实操,小贴士和窍门(附课程)
  15. CMYK色彩印刷原理
  16. 【图解经典算法题】如何用一行代码解决约瑟夫环问题
  17. 计算机硬盘做u盘启动不了,U盘启动找不到硬盘的解决方法
  18. 火狐浏览器如何设置默认打开网页
  19. 2018ACM杰出科学家名单公布,12 位华人学者上榜
  20. 摩伴windows桌面服务器,魔伴Windows桌面app

热门文章

  1. Bulma - 基于 Flexbox 的现代化的 CSS 框架
  2. Kafka: Producer (0.10.0.0)
  3. 【转】C++ 重载、覆盖和隐藏
  4. SVN的使用及MyEclipse的集成
  5. (转)使用C#开发ActiveX控件
  6. prototype、JQuery中跳出each循环的方法
  7. C#多线程学习(五) 多线程的自动管理(定时器)
  8. 转载:东拉西扯:产业链
  9. 中专计算机总结论文,中专计算机毕业论文...doc
  10. 组装电脑配置单报价_怎么选择组装电脑?牢记这四点永不吃亏,第四点最重要...