请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,java版的SortTestHelper.testSort好像有点问题?

  • 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 15:07:38

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 回复 有任何疑惑可以回复我~
  • 提问者 南国漂泊 #1
    我从 README.md 页面的链接 进入的。 也许页面上的链接没更新吧。 我进入的是这个链接 :  https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/02-Sorting-Basic/Course%20Code%20(Java)/04-Selection-Sort-Detect-Performance/src/bobo/algo/SortTestHelper.java    感谢: java中assert需要使用-ea参数打开才能生效 。 好像在 JUnit @Test 时是 自动生效的。
    回复 有任何疑惑可以回复我~ 2018-08-01 15:34:46
  • 提问者 南国漂泊 #2
    我是照着视频,敲代码的。看了下 github 上的 minIndex ,写法更优雅(感觉)。
    回复 有任何疑惑可以回复我~ 2018-08-01 15:39:17
  • liuyubobobo 回复 提问者 南国漂泊 #3
    我没有太理解,你给出的链接是指向SortTestHelper.java的的。但是你说的代码问题行在InsertionSort.java中?
    回复 有任何疑惑可以回复我~ 2018-08-01 15:40:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信