我知道插入排序并不是那么好......但即便如此......对于下面的排序,还有两个更简单的改进?
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;
}
}
答案 0 :(得分:2)
我想到的一件事是,您可以对数组的已排序部分使用二进制搜索来查找它所属的位置,并使用System.arraycopy将子数组移动比迭代更有效。你仍然是O(n ^ 2),但在大型阵列上,这将是一个很小的改进。
另一种方法是声明任何不会改变为最终的变量以允许编译器优化(正如我在评论中所述)。
答案 1 :(得分:1)
根据评论更新:
一些有助于提高可读性的改进:
答案 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更快。
其中大多数可能与平台有关,可能完全不同。