堆排序、中序排序算法实现

现有一无序数组,用两种算法进行排序。

int[] ints = {5,7,2,5,8,9,3,4,6};

第一种:堆排序
算法

  • 从数组索引的第一个位置开始构建二叉树(从左到右,最多两个子节点)
  • 构建最大堆:
    • 从下倒上,从右到左比较最大儿子节点,如果最大儿子比父节点大,则对换;
      确定节点关系 :
      • 父节点个数PC=(L-1)/2 ;
      • 父节点的索引方式(反向遍历,由PC - 1);
      • 子节点的索引:左孩子=PC*2;右孩子=左孩子+1;
  • 根节点与最后一个节点交换;
  • 缩小树,递归执行。

上代码:

 public static void sortByTree(int[] unSortArray){
        int size = unSortArray.length;
        while (size > 2){
            //最大堆
            //循环所有父节点(从后向前循环)
            for(int i=(size-1)/2;i>=1;i--)
            {
                //先找到最大的儿子节点,假设为左儿子
                int maxIndex = i * 2;
                //右儿子存在,且比左儿子大
                if(maxIndex + 1 < size && unSortArray[maxIndex + 1] > unSortArray[maxIndex]){
                    maxIndex ++;
                }

                //最大儿子与父节点进行比较
                if(unSortArray[maxIndex] > unSortArray[i]){
                    int temp = unSortArray[maxIndex];
                    unSortArray[maxIndex] = unSortArray[i];
                    unSortArray[i] = temp;
                }
            }

            //将根节点与最后一个节点交换
            int data = unSortArray[1];
            unSortArray[1] = unSortArray[size - 1];
            unSortArray[size - 1] = data;
            size -- ;
        }
    }


    public static void main(String[] args) {
        int[] ints = {5,7,2,5,8,9,3,4,6};
        sortByTree(ints);
        for (int i = 1; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }

第二种:中序排序
算法:

  • 节点数据增添时,按顺序二叉树,左小右大添加;
  • 遍历时按中序遍历。

实现:
创建节点类:Node 、数据操作类:DoubleTree

上代码:

public class Node {

    int value ;

    Node left;

    Node right;

    public Node(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}
public class DoubleTree {

    Node root;

    /**
     * 顺序添加,满足中序排序要求
     * @param value
     */
    public  void  add(int value){
        Node node = new Node(value);
        if(null == root)
        {
            root = node;
        }
        else
        {
            Node temp = root;
            while (true)
            {
                if(value <temp.getValue()){
                    if(null == temp.getLeft()){
                        temp.setLeft(node);
                        break;
                    }
                    else
                    {
                        temp = temp.getLeft();
                    }
                }
                else
                {
                    if(null == temp.getRight()){
                        temp.setRight(node);
                        break;
                    }
                    else
                    {
                        temp = temp.getRight();
                    }
                }
            }

        }
    }


    /**
     * 打印输出
     */
    public void show(){
        showNode(root);
    }

    /**
     * 中序遍历
     * 条件:
     * 1、顺序二叉树:左小右大
     * @param pnode
     */
    private void showNode(Node pnode){
        //前序遍历
        // System.out.println(pnode.getValue());
        if(null !=pnode.getLeft()){
            showNode(pnode.getLeft());
        }
        //中序遍历
        System.out.println(pnode.getValue());
        if(null !=pnode.getRight()){
            showNode(pnode.getRight());
        }
        //后续遍历
        // System.out.println(pnode.getValue());
    }

public static void main(String[] args) {

        DoubleTree doubleTree = new DoubleTree();
        doubleTree.add(5);
        doubleTree.add(2);
        doubleTree.add(7);
        doubleTree.add(4);
        doubleTree.add(6);
        doubleTree.add(9);
        doubleTree.add(3);
        doubleTree.add(6);
        doubleTree.add(8);
        doubleTree.show();

    }

}

以上两种排序算法,希望大家能够理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值