Java学习-排序二叉树性能简单测试

shawsun 2020-01-20

1.创建4万个随机数,然后用分别用冒泡法,选择法,二叉树法3种排序算法进行排序,比较哪种更快

package Collection;

import java.util.ArrayList;
import java.util.List;

public class sortSpeedTest {

    public static void main(String[] args) {
        int num = 40000; // 元素个数
        int rnd1[] = new int[num];
        for (int i = 0; i < rnd1.length; i++) {
            rnd1[i] = (int) Math.round(Math.random() * 100000);
        }
        int rnd2[] = new int[num];
        int rnd3[] = new int[num];
        System.arraycopy(rnd1, 0, rnd2, 0, rnd1.length);
        System.arraycopy(rnd1, 0, rnd3, 0, rnd1.length);

        long startTime1 = System.currentTimeMillis();
        bubbleSort(rnd1);
        long endTime1 = System.currentTimeMillis();

        long startTime2 = System.currentTimeMillis();
        selectSort(rnd2);
        long endTime2 = System.currentTimeMillis();

        long startTime3 = System.currentTimeMillis();
        List res = binarySort(rnd3);
        long endTime3 = System.currentTimeMillis();

        System.out.printf("冒泡排序耗时:%d ms \n", (endTime1 - startTime1));
        System.out.printf("选择排序耗时:%d ms \n", (endTime2 - startTime2));
        System.out.printf("二叉树排序耗时:%d ms \n", (endTime3 - startTime3));

        // System.out.println("验证rnd1");
        // for(int x:rnd1)
        // System.out.printf(x+" ");
        // System.out.println("\n验证rnd2");
        // for(int x:rnd2)
        // System.out.printf(x+" ");
        // System.out.println("\n验证rnd3");
        // System.out.println(res);

    }

    public static class Node {
        public Node LNode;
        public Node RNode;
        public Object value; // 结点的值

        public void add(Object v) { // 传入的参数是要加入二叉树的新结点的值,是数值!!!
            if (this.value == null) {
                value = v;
            } else {
                if ((Integer) v > (Integer) value) { // 新增的结点的值大于当前结点的值
                    if (RNode == null) { // 当前结点右子树为空,要新建右子树结点
                        RNode = new Node(); // 使当前结点的右子树指向新增的结点,此时RNode的value自然没有赋值,是null
                    }
                    // 如果RNode非空,说明该结点右子树非空,则在右子树的基础上继续调用add以把数值v添加到二叉树正确的位置,
                    // 如果RNode为空,自然是上面新建右子树结点,并且由于此时RNode的value肯定是null,于是调用本身的add方法,把v赋值到RNode的value
                    RNode.add(v);
                } else { // 新增的结点的值小于当前结点的值
                    if (LNode == null) {
                        LNode = new Node();
                    }
                    LNode.add(v);
                }
            }

        }

        // 二叉树的中序遍历,若二叉树本身是排序二叉树,则中序遍历能“有序输出”所有结点数值
        public List<Object> values() { // 返回类型是List
            List<Object> values = new ArrayList<Object>(); // 用来保存中途遍历的结果
            if (LNode != null) {
                values.addAll(LNode.values()); // 左子树非空,递归的“递”
            }

            values.add(value); // 把当前结点数值保存到values列表

            if (RNode != null) {
                values.addAll(RNode.values()); // 右子树非空,递归的“递”
            }

            return values; // 递归的“归”,先上层返回中途遍历结果

        }
    }

    private static List binarySort(int[] rnd) {
        // TODO Auto-generated method stub
        Node root = new Node();
        for (int x : rnd) {
            root.add(x);
        }
        return root.values();
    }

    private static void selectSort(int[] rnd) {
        // TODO Auto-generated method stub
        int i, j, min, tmp, min_index;
        for (i = 0; i < rnd.length; i++) {
            min = 1000000;
            min_index = i;
            for (j = i; j < rnd.length; j++) {
                if (min > rnd[j]) {
                    min = rnd[j];
                    min_index = j;
                }
            }
            tmp = rnd[i];
            rnd[i] = rnd[min_index];
            rnd[min_index] = tmp;
        }
    }

    private static void bubbleSort(int[] rnd) {
        // TODO Auto-generated method stub
        int i, j, tmp;
        for (i = rnd.length - 1; i > 0; i--) {

            for (j = 0; j + 1 < rnd.length; j++) {
                if (rnd[j] > rnd[j + 1]) {
                    tmp = rnd[j];
                    rnd[j] = rnd[j + 1];
                    rnd[j + 1] = tmp;
                }
            }

        }
    }

}

效果图:

Java学习-排序二叉树性能简单测试

 验证语句取消注释后,简单测试100个数据元素的效果图:

Java学习-排序二叉树性能简单测试

 完全正确~

相关推荐