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

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

  1 package Collection;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 public class sortSpeedTest {
  7
  8     public static void main(String[] args) {
  9         int num = 40000; // 元素个数
 10         int rnd1[] = new int[num];
 11         for (int i = 0; i < rnd1.length; i++) {
 12             rnd1[i] = (int) Math.round(Math.random() * 100000);
 13         }
 14         int rnd2[] = new int[num];
 15         int rnd3[] = new int[num];
 16         System.arraycopy(rnd1, 0, rnd2, 0, rnd1.length);
 17         System.arraycopy(rnd1, 0, rnd3, 0, rnd1.length);
 18
 19         long startTime1 = System.currentTimeMillis();
 20         bubbleSort(rnd1);
 21         long endTime1 = System.currentTimeMillis();
 22
 23         long startTime2 = System.currentTimeMillis();
 24         selectSort(rnd2);
 25         long endTime2 = System.currentTimeMillis();
 26
 27         long startTime3 = System.currentTimeMillis();
 28         List res = binarySort(rnd3);
 29         long endTime3 = System.currentTimeMillis();
 30
 31         System.out.printf("冒泡排序耗时:%d ms \n", (endTime1 - startTime1));
 32         System.out.printf("选择排序耗时:%d ms \n", (endTime2 - startTime2));
 33         System.out.printf("二叉树排序耗时:%d ms \n", (endTime3 - startTime3));
 34
 35         // System.out.println("验证rnd1");
 36         // for(int x:rnd1)
 37         // System.out.printf(x+" ");
 38         // System.out.println("\n验证rnd2");
 39         // for(int x:rnd2)
 40         // System.out.printf(x+" ");
 41         // System.out.println("\n验证rnd3");
 42         // System.out.println(res);
 43
 44     }
 45
 46     public static class Node {
 47         public Node LNode;
 48         public Node RNode;
 49         public Object value; // 结点的值
 50
 51         public void add(Object v) { // 传入的参数是要加入二叉树的新结点的值,是数值!!!
 52             if (this.value == null) {
 53                 value = v;
 54             } else {
 55                 if ((Integer) v > (Integer) value) { // 新增的结点的值大于当前结点的值
 56                     if (RNode == null) { // 当前结点右子树为空,要新建右子树结点
 57                         RNode = new Node(); // 使当前结点的右子树指向新增的结点,此时RNode的value自然没有赋值,是null
 58                     }
 59                     // 如果RNode非空,说明该结点右子树非空,则在右子树的基础上继续调用add以把数值v添加到二叉树正确的位置,
 60                     // 如果RNode为空,自然是上面新建右子树结点,并且由于此时RNode的value肯定是null,于是调用本身的add方法,把v赋值到RNode的value
 61                     RNode.add(v);
 62                 } else { // 新增的结点的值小于当前结点的值
 63                     if (LNode == null) {
 64                         LNode = new Node();
 65                     }
 66                     LNode.add(v);
 67                 }
 68             }
 69
 70         }
 71
 72         // 二叉树的中序遍历,若二叉树本身是排序二叉树,则中序遍历能“有序输出”所有结点数值
 73         public List<Object> values() { // 返回类型是List
 74             List<Object> values = new ArrayList<Object>(); // 用来保存中途遍历的结果
 75             if (LNode != null) {
 76                 values.addAll(LNode.values()); // 左子树非空,递归的“递”
 77             }
 78
 79             values.add(value); // 把当前结点数值保存到values列表
 80
 81             if (RNode != null) {
 82                 values.addAll(RNode.values()); // 右子树非空,递归的“递”
 83             }
 84
 85             return values; // 递归的“归”,先上层返回中途遍历结果
 86
 87         }
 88     }
 89
 90     private static List binarySort(int[] rnd) {
 91         // TODO Auto-generated method stub
 92         Node root = new Node();
 93         for (int x : rnd) {
 94             root.add(x);
 95         }
 96         return root.values();
 97     }
 98
 99     private static void selectSort(int[] rnd) {
100         // TODO Auto-generated method stub
101         int i, j, min, tmp, min_index;
102         for (i = 0; i < rnd.length; i++) {
103             min = 1000000;
104             min_index = i;
105             for (j = i; j < rnd.length; j++) {
106                 if (min > rnd[j]) {
107                     min = rnd[j];
108                     min_index = j;
109                 }
110             }
111             tmp = rnd[i];
112             rnd[i] = rnd[min_index];
113             rnd[min_index] = tmp;
114         }
115     }
116
117     private static void bubbleSort(int[] rnd) {
118         // TODO Auto-generated method stub
119         int i, j, tmp;
120         for (i = rnd.length - 1; i > 0; i--) {
121
122             for (j = 0; j + 1 < rnd.length; j++) {
123                 if (rnd[j] > rnd[j + 1]) {
124                     tmp = rnd[j];
125                     rnd[j] = rnd[j + 1];
126                     rnd[j + 1] = tmp;
127                 }
128             }
129
130         }
131     }
132
133 }

效果图:

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

完全正确~

原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/12219509.html

时间: 2024-10-19 03:20:29

Java学习-排序二叉树性能简单测试的相关文章

java学习-排序二叉树

(排序)二叉树的创建及中序遍历 写起来比C复杂一点,思路大同小异~ 1 package Collection; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 /* 6 * (排序)二叉树的创建及中序遍历 7 */ 8 public class Node { 9 public Node LNode; 10 public Node RNode; 11 public Object value; // 结点的值 12 13 publ

Windows IO 性能简单测试

转自:http://bbs.csdn.net/topics/360111289, 有改动. #include <windows.h>#include <stdio.h>#include <process.h>#include<memory>#pragma comment(lib,"ws2_32.lib")ULONGLONG g_nReadCounts=0,g_nWriteCounts=0,g_nOtherCounts=0,g_nReads

EntityFramework 性能简单测试

EntityFramework 的便捷不多阐述, 就他的性能来测试了下  不做评论,   缓存机制确实还不错  .... 简单的查询一条数据 1 public static IM_CallRecord GetEFData() 2 { 3 using (ModelContainer mv = new ModelContainer()) 4 { 5 return (from c in mv.IM_CallRecord where c.id == 12356 select c).SingleOrDef

sqlite性能简单测试

主要测试sqlite在大数据量下的插入及查询性能: 测试环境:Centos6.4  1G内存  单核 数据量 大小 索引字段检索(耗时) 非索引字段检索(耗时) 总插入时间 10W 19M 0.001s 0.036s 5.1s 50W 100M 0.0014s 0.147s 32.21s 100W 200M 0.0009s 5.277s 63.29s 200W 400M 0.0008s 12.51s 130.2s 500W 1002M 0.0016s 17.3s 513.1s 1000W 2G

[java学习点滴]jedis的简单使用

环境: idea.jedis 2.8.0.windows 7sp1 引入jar包: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency> 封装简单类,可以用于分布式,引入了连接池 public final class JedisUtil

java学习之二叉树的实现

二叉树是一种数据结构,每个节点都有两个子节点. 二叉树的遍历有三种方式, 先序遍历是 根节点,左子树,右子树: 中序遍历是 左子树,根节点,右子树: 后序遍历是 左子树,右子树,根节点: java实现: 1 package com.gh.Binary; 2 3 /** 4 * 二叉树的实现 5 * 6 * @author ganhang 7 * 8 */ 9 public class BinaryTreeDemo { 10 public static void main(String[] arg

Java学习笔记——设计模式之一简单工厂

蜀道之难.难于上青天,侧身西望长咨嗟 --蜀道难 设计模式第一篇,简单工厂. 定义Operation类 1 package cn.no1.simplefactory; 2 3 public abstract class Operation { 4 5 private double numA; 6 private double numB; 7 8 public double getNumA() { 9 return numA; 10 } 11 12 13 public void setNumA(d

java学习-排序及加密签名时数据排序方式

排序有两种, 基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,用于列表List或数组arrays的排序 Comparable<Integer>接口方法的实现,对象列表的升序降序接口 我们通过重写改接口方法,可以对列表进行升序或降序排列. public int compareTo(T o); This interface imposes a total ordering on the objects of each clas

Monkey学习(4)简单测试实例

1.首先测试设备是否连接成功,在命令行中输入: adb devices 如果出现设备信息,代表链接成功.我这里的设备名称是“emulator-5554” 2.得到测试apk的包名,如果有APK源码包的话直接将“.apk”后缀改为“.zip”然后打开包中的AndroidManifest.xml可以查看包名,  如果没有或者已经安装的点击应用程序,然后查看logcat信息,也能够找到包名,同时在/data/data/目录下面有全部的应用程序的包名,  查询命令是: adb shell   #cd /