我有一个下面写的函数。这个函数本质上是一个归并排序算法。
public static long nlgn(double[] nums) {
if(nums.length > 1) {
int elementsInA1 = nums.length/2;
int elementsInA2 = nums.length - elementsInA1;
double[] arr1 = new double[elementsInA1];
double[] arr2 = new double[elementsInA2];
for(int i = 0; i < elementsInA1; i++)
arr1[i] = nums[i];
for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
arr2[i - elementsInA1] = nums[i];
nlgn(arr1);
nlgn(arr2);
int i = 0, j = 0, k = 0;
while(arr1.length != j && arr2.length != k) {
if(arr1[j] <= arr2[k]) {
nums[i] = arr1[j];
i++;
j++;
} else {
nums[i] = arr2[k];
i++;
k++;
}
}
while(arr1.length != j) {
nums[i] = arr1[j];
i++;
j++;
}
while(arr2.length != k) {
nums[i] = arr2[k];
i++;
k++;
}
}
return nuts;
}
由于这是归并排序,根据我的研究,该算法的大O复杂度为O(n lgn)。然而,当我运行计时测试时,得到的结果并不表明它在O(n lgn)时间内运行。尽管在两个for循环的末尾之前,它的运行时间是O(n)。但一旦超过此点,每个元素的排序应该在O(lgn)时间内完成。
我的问题是,是否有人能够确认这段代码是否以O(n lgn)时间运行?如果不是,我想知道我对此的理解哪里出了问题。
O(n lgn)
之外还有什么其他建议吗?(忽略任何小于一秒的结果,增加问题规模。)如果O(lgn)时间
不是打字错误,请你为这个结果辩护一下好吗? - greybeardif(nums.length <= 1)return nums;
,则缩进级别将减少一个。for(int i = elementsInA1; i <elementsInA1 + elementsInA2; i ++)arr2 [i - elementsInA1] = nums [i];
看起来比for(int i = 0; i <elementsInA2; i ++)arr2 [i] = nums [elementsInA1 + i];
更复杂。)(已删除有关_space_复杂性的错误评论-我的错)。 - greybeard