老师,java版的SortTestHelper.testSort好像有点问题?
来源:2-6 插入排序法的改进
南国漂泊
2018-08-01
assert isSorted( arr );
以上这句在 false 时,并不抛异常,没有阻断程序执行,程序正常结束。
throw new RuntimeException("isSorted : false"); 或者 throw new Error("isSorted : false"); 可以抛异常并阻断程序运行
public static boolean isSorted(Comparable[] arr){ for(int i=0; i<arr.length-1; i++){ if( arr[i].compareTo(arr[i+1]) > 0){ return false; } } return true; } public static void testSort(ISort sortInstance, Comparable[] arr){ long begin = System.currentTimeMillis(); sortInstance.sort(arr); long end = System.currentTimeMillis(); // assert isSorted(arr); if(!isSorted(arr)){ throw new Error("isSorted : false"); // throw new RuntimeException("isSorted : false"); } System.out.println(String.format("%s : %s ms", sortInstance.getClass().getSimpleName(), (end - begin))); }
用了个自定义接口(与问题无关)
public interface ISort<T extends Comparable> { void sort(T[] arr); }
主要是这个代码
public class InsertionSortV2<T extends Comparable> implements ISort<T> { @Override public void sort(T[] arr) { for(int i=1; i<arr.length; i++){ T e = arr[i]; // 将 i 位置的元素保存在 e 中。 int j ; // 保存元素 e 应该插入的位置 for(j=i; j>0; j--){ if(arr[j-1].compareTo(arr[j]) > 0){ // if(arr[j-1].compareTo( e ) > 0){ arr[j] = arr[j-1]; }else{ break; } } arr[j] = e; // 这里 不可以直接写 arr[j] = arr[i]; } } public static void main(String[] args) { InsertionSortV2<Integer> is = new InsertionSortV2<>(); int n = 10; Integer[] intArr = SortTestHelper.generateRandomArray(n, 0, 1000); SortTestHelper.printArray(intArr); SortTestHelper.testSort(is, intArr); SortTestHelper.printArray(intArr); // SortTestHelper.printArray(intArr); // is.sort(intArr); // SortTestHelper.printArray(intArr); } }
第 8 行 是错误的写法,但是
如果用 assert 在main中不打印下排序前后的数组,会误以为排序是成功的。
写回答
1回答
-
java中assert需要使用-ea参数打开才能生效。不过确实,使用异常更好,在我的新课《玩转数据结构》中统一使用了异常的方式。有时间我再过一遍这个课程的代码,把assert的地方都改成抛异常:)
我该才check了一下课程github上的代码,是按照你注释的第9行的方式写的,而不是第8行的方式?我有点儿忘记了,不确定这个地方是不是修改过。传送门:https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/02-Sorting-Basic/Course%20Code%20(Java)/06-Insertion-Sort-Advance/src/bobo/algo/InsertionSort.java
课程代码请以课程官方github代码为准:)传送门:https://github.com/liuyubobobo/Play-with-Algorithms
谢谢你的提醒:)加油!
072018-08-01
相似问题