为什么我的排序算法比 H.Cormen 书中 "Introduction to Algorithms" 中的排序算法快?
Why is my sorting algorithm faster than the one in "Introduction to Algorithms" by H.Cormen book?
我从昨天开始学习这本书,在我理解并应用了第一个算法之后,我尝试着自己去换个角度看。这是 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 毫秒。我还在从算法开始,所以我不知道什么意思。
以我的经验(阅读学生的经验)这种不同的值意义不大。
也许你有一个后台进程从一个到另一个占用/释放了更多的资源。
也许您尝试安排的特定案例对于其中一种算法比另一种算法更好。
也许,如果您使用不同的随机数组,其中一个比另一个更接近排序..
要有好的措施,你通常要做很多测试,而不是只有一个。例如,生成 1k 个数组,每个数组包含 10k 个元素,并使用两种算法对该数组中的每个数组进行排序..
无论如何,有时某种语言或编译器的特定 特性 可以为理论上具有完全相同复杂度的算法生成不同的结果(一个例子:有一次我在 C++ 中注意到,如果你遍历一个二维数组,首先按列然后按行,你的速度将与你反过来做的速度大不相同;但我不记得哪个更快 tbh)。
我发现为什么你的排序比原来的排序快得多:因为你根本没有做排序。
在你的代码中
int value = array[i];
int j = i;
while(j < array.length && value > array[j]) { ... }
因为j = i
,所以value == array[j]
在你进入while循环之前,因此你的while循环体永远不会执行。您的排序结果将是错误的。这就是您的代码速度极快的主要原因。
我从昨天开始学习这本书,在我理解并应用了第一个算法之后,我尝试着自己去换个角度看。这是 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 毫秒。我还在从算法开始,所以我不知道什么意思。
以我的经验(阅读学生的经验)这种不同的值意义不大。
也许你有一个后台进程从一个到另一个占用/释放了更多的资源。
也许您尝试安排的特定案例对于其中一种算法比另一种算法更好。
也许,如果您使用不同的随机数组,其中一个比另一个更接近排序..
要有好的措施,你通常要做很多测试,而不是只有一个。例如,生成 1k 个数组,每个数组包含 10k 个元素,并使用两种算法对该数组中的每个数组进行排序..
无论如何,有时某种语言或编译器的特定 特性 可以为理论上具有完全相同复杂度的算法生成不同的结果(一个例子:有一次我在 C++ 中注意到,如果你遍历一个二维数组,首先按列然后按行,你的速度将与你反过来做的速度大不相同;但我不记得哪个更快 tbh)。
我发现为什么你的排序比原来的排序快得多:因为你根本没有做排序。
在你的代码中
int value = array[i];
int j = i;
while(j < array.length && value > array[j]) { ... }
因为j = i
,所以value == array[j]
在你进入while循环之前,因此你的while循环体永远不会执行。您的排序结果将是错误的。这就是您的代码速度极快的主要原因。