为什么在Mergesort程序中,时间复杂性如此不规则,应该使用nlogn图严格增加

时间:2018-02-23 11:20:27

标签: java sorting

输出应该以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

1 个答案:

答案 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];
    }

如果你可以从你的时间中删除这一部分,你可能会看到一个更合理的预期数字近似值。