java练习3
随机生成20个数字(随机种子)
分别使用冒泡排序、二叉树排序、插入排序进行排序
并输出最终结果以及三种排序使用的时间
package a01_第一次练习.a03_排序;import java.time.Duration; import java.time.LocalDateTime; import java.util.TreeSet;public class Test {public static void main(String[] args) {int[] arr = new int[20];for (int i = 0; i < 20; i++) {arr[i] = (int) Math.ceil(Math.random()*100);}int[] arr1 = new int[20];System.arraycopy(arr, 0, arr1, 0, 20);int[] arr2 = new int[20];System.arraycopy(arr, 0, arr2, 0, 20);int[] arr3 = new int[20];System.arraycopy(arr, 0, arr3, 0, 20);//冒泡排序LocalDateTime now1 = LocalDateTime.now();for (int i = 0; i < arr1.length - 1; i++) {for (int j = 0; j < arr1.length - 1 - i; j++) {if(arr1[j] > arr1[j + 1]){int temp = arr1[j];arr1[j] = arr1[j + 1];arr1[j + 1] = temp;}}}LocalDateTime now2 = LocalDateTime.now();printArr(arr1);System.out.println("冒泡排序耗时:"+ Duration.between(now1, now2).toNanos() +"纳秒");//二叉树排序now1 = LocalDateTime.now();TreeSet<Integer> ts = new TreeSet<>();for (int i = 0; i < arr2.length; i++) {ts.add(arr2[i]);}now2 = LocalDateTime.now();System.out.println (ts);System.out.println("二叉树排序耗时:"+ Duration.between(now1, now2).toNanos() +"纳秒");//插入排序now1 = LocalDateTime.now();int startIndex = -1;for (int i = 0; i < arr3.length; i++) {if(arr3[i] > arr3[i + 1]){startIndex = i + 1;break;}}for (int i = startIndex; i < arr3.length; i++) {int j = i;while(j > 0 && arr3[j] < arr3[j - 1]){int temp = arr3[j];arr3[j] = arr3[j - 1];arr3[j - 1] = temp;j--;}}now2 = LocalDateTime.now();printArr(arr3);System.out.println("插入排序耗时:"+ Duration.between(now1, now2).toNanos() +"纳秒");}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();} }
冒泡排序:
相邻的元素两两比较,大的放右边,小的放左边。
外循环:表示要执行多少轮。
内循环:每一轮中找到当前的最大值
二叉树排序:
使用add方法自然排序
插入排序:
将 0 索引的元素到 N 索引的元素看做是有序的,把 N+1 索引的元素到最后一个当成是无序的
遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面
困惑:
时间间隔为0
当使用更长的数组排序时,时间间隔不为0
感悟:
冒泡排序效率低