输出应该以nlogn图表的形式增加。为什么这个时间如此不规则?
for(int j=5000;j<=50000;j=j+5000){
array = new int[j];
for(i=0;i<j;i++)
{
array[i] = r.nextInt(10000);
}
long startTime = System.nanoTime();
mergeSort(array);
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println("The time taken for" + j + "is" +totalTime );
我对mergesort的逻辑是
static void mergeSort(int A[])
{
int n=A.length;
if(n<2)
return;
int m = n/2;
int leftArray[] = new int[m];
int rightArray[] = new int[n-m];
for(int i=0;i<=m-1;i++)
{
leftArray[i] = A[i];
}
for(int i=m;i<=n-1;i++)
{
rightArray[i-m] = A[i];
}
mergeSort(leftArray);
mergeSort(rightArray);
merge(leftArray,rightArray,A);
}
static void merge(int L[],int R[],int A[])
{
int nL = L.length;
int nR = R.length;
int i,j,k;
i=j=k=0;
while(i<nL && j<nR)
{
if(L[i]>=R[j])
{
A[k++] = R[j];
j++;
}
else
{
A[k++] = L[i];
i++;
}
}
while(i<nL)
{
A[k++] = L[i];
i++;
}
while(j<nR)
{
A[k++] = R[j];
j++;
}
}
输出以纳秒为单位
5000年的时间是1853169
10000的时间是3428060
15000所需时间为4800190
20000所需时间为3871340
25000所花费的时间是5546668
30000的时间是7311482
35000所需时间为7523683
40000的时间是11520758
45000所花费的时间是8730432
50000所用的时间是9097064
答案 0 :(得分:0)
您测量的大部分时间很可能只是代码的这一部分:
int leftArray[] = new int[m];
int rightArray[] = new int[n-m];
for(int i=0;i<=m-1;i++)
{
leftArray[i] = A[i];
}
for(int i=m;i<=n-1;i++)
{
rightArray[i-m] = A[i];
}
如果你可以从你的时间中删除这一部分,你可能会看到一个更合理的预期数字近似值。