我从昨天开始学习这本书,在我理解并应用了第一个算法之后,我试着独自一人,以不同的方式看待。在Java中,这里显示了算法:
public static int[] sort(int[] array)
{
for(int i = 1; i < array.length; i++){
int value = array[i];
int j = i - 1;
while(j >= 0 && array[j] > value){
array[j + 1] = array[j];
j--;
}
array[j+1] = value;
}
return array;
}
这是我的:
public static int[] sortb(int[] array)
{
for(int i = 0; i < array.length; i++){
int value = array[i];
int j = i;
while(j < array.length && value > array[j]){
array[j] = array[j + 1];
j++;
}
array[j] = value;
}
return array;
}
对于每个函数调用100万个,第一个函数为32毫秒,第二个函数为25毫秒。我仍然从算法开始,所以我不知道其含义。
答案 0 :(得分:6)
我发现为什么你的排序比原始排序快得多:因为你根本就没有排序。
在您的代码中
int value = array[i];
int j = i;
while(j < array.length && value > array[j]) { ... }
因为j = i
,所以在进入while循环之前value == array[j]
,因此你的while循环体永远不会执行。你的排序结果将是错误的。这是您的代码速度极快的主要原因。
答案 1 :(得分:5)
根据我的经验(阅读学生的经历),这种不同的价值观没什么意义。
也许你有一个后台进程从一个到另一个接受/释放了更多的资源。
也许你试图安排的具体案例对于其中一个algorythms比另一个更好。
也许,如果你使用不同的随机数组,其中一个比其他数组更接近排序..
要采取好的措施,通常需要做很多测试,而不仅仅是一个。例如,每个生成1k个10k元素的数组,并用这两个algorythms对每个数组进行排序。
无论如何,有时语言或编译器的特定特性可以为algorythms生成不同的结果,理论上完全相同的复杂度(一个例子:如果你遍历一个二维数组我曾在C ++中注意到首先是列,然后按行,你的速度会比你反过来的速度快得多;但是我不记得哪一个更快了。)