比较器排序原理的分析

来源:互联网 发布:固定收益 经典知乎 编辑:程序博客网 时间:2024/04/26 04:47

比较器对一个数组对象进行排序时,首先根据数组当中的数据元素建立一棵顺序二叉树。即以第一个数据为根结点,接下来的数据比根结点大时设置为右子树,比根结点小时设置为左子树,以此来构建一棵二叉排序树。然后通过中序遍历的方式将数据进行输出就可以完成排序操作。

public class ComaprableDemo02 {public static void main(String[] args) {Comparable com=null;//声明一个比较器对象com=30;//将数字30自动装箱为Integer类型后然后赋值给比较器变量System.out.println("内容为:"+com);}}
程序运行后输出的结果为:30

以下代码为构建一棵顺序二叉树并通过中序遍历来对其进行输出操作:

public class BinaryTree {class Node//建立一个内部类,该类用于结点的定义{private Comparable data;//声明结点数据的类型为一个比较器类型的变量,即该变量可以接收任何类型的数据并用于进行比较操作private Node left;//建立指向左右子树的指针变量private Node right;//建立一个构造方法来为新节点设置其数据值public Node(Comparable data){this.data=data;}public void addNode(Node newNode){//用于判断newNode是放于node节点的左子树还是右子树位置处if(newNode.data.compareTo(this.data)<0)//node为newNode结点的父节点,this.data为父节点当中的数据内容<0,表明子节点数据小于父节点数据,所以子节点作为父节点的左子树{//表明父节点左子树为空if(this.left==null){this.left=newNode;//则将子节点直接赋值给父节点的左结点}else//当当前结点的左子树不为空时,则进行递归调用来判断左子树的左子树,判断新插入的结点应该放于左孙子的左边还是右边{this.left.addNode(newNode);}}if(newNode.data.compareTo(this.data)>=0)//当前结点大于根结点时,将新插入的结点放于根结点的右子树上{if(this.right==null){//右子树为空时,将新插入的结点作为右子树this.right=newNode;}else{//当根结点的右子树不为空时递归调用来判断右子树的子节点与新插入的结点的大小关系this.right.addNode(newNode);}}}public void printNode()//从当前结点开始(根结点)采用中序遍历的方式对结点进行打印输出操作{//当当前结点(根结点)左子树不为空时if(this.left!=null){this.left.printNode();//当前左子树左作为递归调用本函数时的父节点}//当前二叉树的左子树全部遍历完毕即到达叶子结点System.out.print(this.data+"\t");//对当前叶子结点进行输出操作,叶子结点的左子树为空,遍历根结点(叶子结点),(左->根->右)if(this.right!=null){this.right.printNode();//开始遍历右子树当中的左子树}}}private Node root=null;//声明根结点变量用于指向二叉树的根结点public void add(Comparable data)//用于向顺序二叉树当中添加结点{Node newNode=new Node(data);//建立一个新的二叉树结点,并将指定的数据元素赋值给所创建的新的结点if(root==null)//表明当前的二叉树为空树{root=newNode;//则另新创建的新的结点作为二叉树的根结点}else{root.addNode(newNode);//判断当前新加入的结点是作为二叉树的左子树结点还是右子树结点}}//对二叉树当中的数据进行打印输出public void print(){this.root.printNode();//通过根结点来对其左右字数进行打印输出}}
public class ComparableDemo03 {public static void main(String[] args) {BinaryTree bt=new BinaryTree();//建立一个二叉树对象//将8,3,10,9,1,5六个数字构造成一颗二叉树并通过中序遍历的方式进行输出操作bt.add(8);bt.add(3);bt.add(10);bt.add(9);bt.add(1);bt.add(5);System.out.println("排序之后的结果为:");bt.print();}}
程序最终运行结果为:



以上二叉树的构建和输出就是比较器comparable类的工作原理

0 0