java炫酷龙卷风源码_Java-使用二叉树实现快速排序-遁地龙卷风
(-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-使用二叉树实现快速排序-遁地龙卷风相关推荐
- java炫酷龙卷风源码,PS合成超炫的炸裂龙卷风场景
7.下面将利用图层蒙版隐藏多余的闪电图像.单击添加图层蒙版按钮为"图层1"添加图层蒙版,设置前景色为黑色,选择画笔工具并设置适当的画笔大小及不透明度,在多余的闪电图像上涂抹以将其隐 ...
- java代码实现龙卷风_Java-使用二叉树实现快速排序-遁地龙卷风
(-1)写在前面 在一次面试中被问及快速排序,回来后又看了一次以前做过的案例,说来惭愧,时至今日还需要读好长时间,才能明白自己代码的意思,主要是缺少注释和图解,深有感慨,决定好好记录一下. 之所以使用 ...
- java短信接口源码_java免费短信接口开发源码
java免费短信接口开发源码 更多 作者:捷信通来源:www.jiexintong.cn日期:2014-07-30 17:08:51 微宏捷信通短信接口提供适应C#.Java..NET等多种主流开发语 ...
- java在线学习系统源码_java学习成长之路(基础,源码,项目,实战)
获取一下学习资源请关注微信公众号:Java编程指南 我为自学编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么疑问 ...
- java期末考试卷及答案_java期末考试试卷及答案1
本科java程序设计期末考试试卷 <Java 程序设计>期末考试试卷 第 1 页 共 9 页 学年 学期期末考试卷 卷 课程 <Java 程序设计> 考试时间: 120 分钟 ...
- java微信支付接口源码_java微信支付源码(WxPayAPI_JAVA_v3)
[实例简介] [实例截图] [核心代码] package com.github.wxpay.sdk; import java.util.HashMap; import java.util.Map; i ...
- java手机小游戏源码_Java手机版数独小游戏(J2me)JAVA游戏源码下载
数独游戏,相信朋友们都知道的,以前也经常玩的,用VB.VC++和Delphi版编写的都在网上宣布过,今天放出一个鉴于Java的J2me手机版的,大致看一下截图,这是在Java模拟机运行的界面,带有Ja ...
- java sso单点登录源码_Java单点登录系统 sso源码下载
这是一个使用Java开发的单点登陆系统(sso). 运行截图 单点登陆介绍 单点登录,这就是我们通常称之为SSO.一般来说,大型系统平台将使用这些东西.它解决了频繁登录和验证的过程,即用户的一次登录被 ...
- java ftp下载文件源码_java实现ftp文件下载的源代码
这几天做的一个项目中用到了ftp文件传输,用java实现了ftp文件的下载. 一.win7下搭建ftp服务器 详见:http://jingyan.baidu.com/article/4b52d7026 ...
最新文章
- 成本预算的四个步骤_干货!如何做好年度培训计划中的预算工作
- 附加到IIS进程调试页面
- mvvm绑定checkbox wpf_wpf中使用mvvm,解决checkbox全选问题
- 华为服务器芯片总在pc,服务器芯片 华为
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- css圆角box(宽度自适应)(百度知道挖出)
- max31865C语言程序,max31865温度传感器通信驱动代码
- HTML实现W3school导航栏(附带重置样式表reset.css)
- 数字频率计的Verilog设计
- ssl证书下载与安装 – 如何下载ssl证书
- python与爬虫-02复杂的HTML解析
- 北航计算机学院本科优秀毕业论文,北航本科毕业论文
- sql server复习 练习
- 30 个 Python3 的最佳实操,小贴士和窍门(附课程)
- CMYK色彩印刷原理
- 【图解经典算法题】如何用一行代码解决约瑟夫环问题
- 计算机硬盘做u盘启动不了,U盘启动找不到硬盘的解决方法
- 火狐浏览器如何设置默认打开网页
- 2018ACM杰出科学家名单公布,12 位华人学者上榜
- 摩伴windows桌面服务器,魔伴Windows桌面app
热门文章
- Bulma - 基于 Flexbox 的现代化的 CSS 框架
- Kafka: Producer (0.10.0.0)
- 【转】C++ 重载、覆盖和隐藏
- SVN的使用及MyEclipse的集成
- (转)使用C#开发ActiveX控件
- prototype、JQuery中跳出each循环的方法
- C#多线程学习(五) 多线程的自动管理(定时器)
- 转载:东拉西扯:产业链
- 中专计算机总结论文,中专计算机毕业论文...doc
- 组装电脑配置单报价_怎么选择组装电脑?牢记这四点永不吃亏,第四点最重要...