插入排序...调整改善?

时间:2011-02-23 18:47:45

标签: java algorithm sorting

我知道插入排序并不是那么好......但即便如此......对于下面的排序,还有两个更简单的改进?

public static void insertion_sort_with_moves(int[] arr){
    for (int i = 1; i <= arr.length; i++){
        int v = arr[i-1];
        int j = i-1;
        for (/*declared j outside loop*/; j > 0; j--) {
            //compswap(a[j-1], a[j]);
            if (v < arr[j-1]) arr[j] = arr[j-1];
            else break;
        }
        arr[j] = v;
    }
}

3 个答案:

答案 0 :(得分:2)

我想到的一件事是,您可以对数组的已排序部分使用二进制搜索来查找它所属的位置,并使用System.arraycopy将子数组移动比迭代更有效。你仍然是O(n ^ 2),但在大型阵列上,这将是一个很小的改进。

另一种方法是声明任何不会改变为最终的变量以允许编译器优化(正如我在评论中所述)。

答案 1 :(得分:1)

根据评论更新:

一些有助于提高可读性的改进:

  1. 请勿在方法名称中使用下划线。请改用驼峰盒。
  2. 考虑if / else语句周围的花括号,以使它们更容易阅读或至少放入更多新行。
  3. 如果不需要,请删除已注释掉的代码。
  4. 考虑删除解释“what”而不是“why”的注释。
  5. 尽量避免使用一个字符变量,尤其是当您在同一范围内有多个字符变量时。
  6. 您可以为每个循环使用a,而不必声明和访问v变量。 (仍然需要当前索引,但其他更改可能允许这样做)

答案 2 :(得分:1)

一些微观优化是:

1,2,3)

    int len = arr.length; 
...

    for (int i = 0; i < len; ++i){
            int v = arr[i];
            int j = i;

使您免于计算i-1两次,++ i比i ++快。 不确定长度的东西(可以在访问类成员时保存偏移量添加)。

4,5)

for (/*declared j outside loop*/; j != 0; --j) {

j!= 0应该比j> 0更快(实际上不要期望太多)并且 - j比j更快。

其中大多数可能与平台有关,可能完全不同。