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炫酷龙卷风源码_Java-使用二叉树实现快速排序-遁地龙卷风
(-1)写在前面 在一次面试中被问及快速排序,回来后又看了一次以前做过的案例,说来惭愧,时至今日还需要读好长时间,才能明白自己代码的意思,主要是缺少注释和图解,深有感慨,决定好好记录一下. 之所以使用 ...
- java代码的接口_Java代码--简单接口的实现
Eclipse中新建web项目,项目中新建一个servlet接口,servlet中java代码如下: public void doGet(HttpServletRequest request, Htt ...
- java 代码性能优化_Java代码性能优化的几个小技巧
Java代码性能优化的几个小技巧 时间:2017-08-07 来源:华清远见JAVA学院 代码优化是程序员必须懂得一门学问,所以不管是程序员还是准程序员,养成良好的代码优化习惯都是必须要养成的 ...
- java代码编译过程_Java代码编译和执行的整个过程
一.简述 Java代码编译和执行的整个过程包含了三个重要的机制:①Java源码编译机制:②类加载机制:③类执行机制 二.Java源码编译机制 Java代码编译是由Javac编译器来完成,流程如图: J ...
- java代码批量下载_Java代码实战:线程池实现批量下载文件
今天技术之家陪你一起Java代码实战:线程池实现批量下载文件: 1 创建线程池package com.cheng.webb.thread; import java.util.concurrent.Ar ...
- java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树
Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...
- java代码逻辑讲解_java逻辑控制语句实例详解
一.Java选择结构 1.if(条件)-else结构 当条件==true时执行if下的语句,否则执行else下的语句 2.if(条件1)-else if(条件2)-else结构(相关视频教程推荐:ja ...
- java代码详细注释_java代码详细注释
请将下面的java程序代码给加详细的注释(部分已给出),谢谢了,回答满意再追加20分publicclassChatUDPJFrameextendsJFrameimplementsActionListe ...
- java代码实现链表_java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
最新文章
- Kettle数据采集 部署安装
- OPUS 视频PPT介绍
- 过程化技术:打造「开放世界」的秘密
- ios基础篇(二十六)—— UITableViewCell的分组索引与标记
- 【GRE协议】CentOS配置GRE隧道
- 基于Opencv3.0对图像进行透视变换
- 高通音频驱动调试(十七)
- poj-3176 Cow Bowling poj-1163 The Triangle hihocoder #1037 : 数字三角形 (基础dp)
- 【WiFi】WiFi 6E
- 运行Wlmadmin无法访问计算机,网络许可证管理员指引.PDF
- 算法的时间复杂度和空间复杂度-总结
- 中缀/后缀/前缀表达式及相互转换的手算详细步骤及C代码实现
- 微型计算机要与局域网连接必须安装的硬件,计算机与局域网连接需要什么硬件...
- 二元函数凹凸性判定及最值定理
- Fail Open Hav
- TSINGSEE青犀视频开发安全帽智能检测识别经验分享
- onedrive的多电脑同步妙用
- python入门指南 许半仙txt百度云-《漩涡》TXT全本 百度云网盘下载 by就不告诉你...
- lg显示器工厂模式怎么进入_aoc显示器如何进入工程模式
- 相控阵雷达天线与MIMO天线的区别
热门文章
- EasyPoi读取word时报错java.util.zip.ZipException: Unexpected record signature: 0X9
- 成熟盈利模式的胜利--短信市场分析案例
- 超越咨询顾问的算力,在 BI:大数据改变管理咨询
- 微信小程序(图像识别)腾讯云、百度智能云API(含源码)
- 要有所得,就要先有所失去
- html5拖拽式建站源码,拖拽式建站是怎么实现的,拖拽式h5建站源码
- echarts 3D地球实现自动旋转
- python编程课程-吐血整理!程序员最爱的13个免费Python课程
- python字典操作的方法_python 字典操作方法详解
- java服务器为Iphone终端推送消息