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<len;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<right)//结束循环后,tempNumber的左边是比他大的数,tempNumber的右边是比他小的数
{
while(left<right && tempNumber>=oop[right])//从右边找到比tempNumber大的数
right--;
if(left<right)
{
oop[left] = oop[right];//将右边的数赋值给左边的
left++;//缩减范围
}
while(left<right && tempNumber<=oop[left])//从左边开始找比tempNumber小的数
left++;
if(left<right)
{
oop[right] = oop[left];//将左边的数赋值给右边
right--;//缩减范围
}
}
//此时left==right
oop[left] = tempNumber;
if(right<tempBinary.getRight()-1)//创建左孩子
{
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)写在前面 最近参加了一次面试,对笔试题很感兴趣,就回来百度一下.通过对这些题目的思考让我想起了建模中的关联,感觉这些题如果没接触就是从0到1,考验逻辑思维的话从1到100会更好,并且编程简易模 ...
- jquery toggle方法使用出错?请看这里-遁地龙卷风
这个函数在1.9之前和1.9之后的用法大不相同 1 1.9之间,用于点击元素时函数的轮流执行 toggle(function() { alert(1);//1,3,5,7... },function( ...
- JQuery data方法的使用-遁地龙卷风
(-1)说明 我用的是chrome49,这个方法涉及到JQuery版本问题,我手里有3.0的,有1.9.1,后面将1.9.1及其以前的称为低版本,3.0称为高版本 测试例子用到的showMessage ...
- JQuery simpleModal插件的使用-遁地龙卷风
(0)写在前面 jquery.simpleModal.浏览器这三者的兼容性,不仅显示在报错上,还体现在所呈现的效果不是预期上. 说一下我的环境 jquery-1.8.3.js jquery.simpl ...
- Java排序算法之快速排序
Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...
- java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...
- Java实现二叉树及相关遍历方式
Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...
- 数据结构(5):Java实现二叉树
二叉树图: package com.test.Sort; import java.util.ArrayList; import java.util.LinkedList; public class B ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
随机推荐
- JWS.Mono如何进行“在线安装”
这里话就不多说了,使用方法如下: wget http://jhonge.net/down4load/1413998270361/jwsmono_net.sh chmod a+x jwsmono_net ...
- 《3D Math Primer for Graphics and Game Development》读书笔记2
<3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...
- 【Paddy】数据库监控系列(一) - 监控理念
很多时候,都和身边朋友聊两个问题,DBA的日常工作都是哪些?什么才是数据库方面最重要的? 我相信这两个问题的答案每个人都不会完全一样,我也是,所以这里只代表我的个人观点,并且以下的内容将围绕我的思路展 ...
- Optimistic Concurrency VS. Pessimistic Concurrency Control
原创地址:http://www.cnblogs.com/jfzhu/p/4009918.html 转载请注明出处 (一)为什么需要并发控制机制 并发控制机制是为了防止多个用户同时更改同一条数据,也 ...
- C语言 · Interval · 求矩阵元素和
问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...
- Hystrix框架2--超时
timeout 在调用第三方服务时有些情况需要对服务响应时间进行把控,当超时的情况下进行fallback的处理 下面来看下超时的案例 public class CommandTimeout exten ...
- Java面试(1)-- Java逻辑运算符
class Demo04{ public static void main(String[] args){ //逻辑运算符 //例1 System.out.println(true | false & ...
- Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用
Java中负责内存回收的是JVM.通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题.为了解决内存操作不灵活的问题 ...
- WCF学习之旅——第一个WCF示例(三)
第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...
- 【笔记】js获取当前点击元素的索引
以前用jq 做过图片切换 滑动之类的特效现在想用js 试试是怎么一回事 jq图片切换的思路是用index()函数获取当前点击的按钮的索引然后根据索引值将对应索引的图片显示出来 于是查了一下js 是如何 ...