老师,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回答

liuyubobobo

2018-08-01

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


谢谢你的提醒:)加油!

0
7
南国漂泊
非常感谢!
2018-08-01
共7条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程