【问题标题】:Does it make sense to write into insertion sort code if-statement at the final block?在最后一个块中写入插入排序代码 if 语句是否有意义?
【发布时间】:2012-08-26 18:15:33
【问题描述】:

我阅读了 Cormen&Co 的“算法简介”并在 java 上实现算法。我想知道在最终的set() 方法中写入插入排序代码 if 语句是否有意义?如果可能的话,我想让代码更快。

public static void insertion(List<Integer> a) {
    List<Integer> aList = a;
    int temp;
    int previousIndex;

    for (int i = 1; i < aList.size(); i++) {
        temp = aList.get(i);
        previousIndex = i - 1;
        while ((previousIndex >= 0) && aList.get(previousIndex) > temp) {
            aList.set(previousIndex + 1, a.get(previousIndex));
            previousIndex--;
        }

        //if(aList.get(previousIndex + 1) > temp){
            aList.set(previousIndex + 1, temp);
        //}

    }
}

对不起,如果它是初级的。我是初学者。

【问题讨论】:

  • 函数的第一行是use less:你只是指向同一个对象。你应该做什么 id aList = a.clone()aList = new ArrayList&lt;Integer&gt;() 并使用循环复制元素。
  • 我只是查看了Introduction to algorithms 内部,而if 不在他们的伪代码中。反正也不需要。我真的不明白你在问什么?
  • @Tudor,如果可能的话,我只想让代码更快。 if 语句不在插入排序伪代码中。
  • @elyashiv,它很有用。谢谢!

标签: java algorithm insertion-sort


【解决方案1】:

这看起来像是在尝试优化代码,使其更快。显而易见的想法是对数据进行测试以避免设置它。只有在 (1) 读取和测试值比设置值更快并且 (2) 有足够多的情况下测试会避免设置值时,这才会使执行更快。

IMO (1) 是可疑的,并且 (2) 需要非常频繁才能节省大量时间,我认为情况并非如此。

通过测试 (previousIndex + 1 != i) 而不是 (aList.get(previousIndex + 1) > temp) 可以实现更好的更快测试,如果复制列表的对象,这可能是一个很好的优化会更耗时,比如复制复杂的对象结构。但是,在这种情况下,我们谈论的是整数对象,所以我认为添加测试只会在所有情况下减慢速度。

当然,就像所有优化的情况一样,只有实际的测量才能说明什么是有效的,这就是为什么优化总是最后要做的事情,而且只有在必要时才做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2017-10-04
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多