比较器排序原理的分析

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

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类的工作原理

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值