合并排序为1000万输入

时间:2014-12-01 13:18:09

标签: performance c++11 mergesort chrono ctime

这是我在c ++中的代码。我用过c ++ 11。用于测量以微秒为单位的时间。我的合并排序大约需要24秒来对随机生成的大小为1000万的数组进行排序。但是,当我提到我朋友的结果时,他们有3秒钟。我的代码似乎是正确的,我和他们的不同之处在于他们使用时钟来测量时间而不是时间。这会影响我的结果偏差吗?请回答!

这是我的代码:

#include <iostream>
#include <climits>
#include<cstdlib>
#include<ctime>
#include<chrono>
using namespace std;

void merge_sort(long* inputArray,long low,long high);
void merge(long* inputArray,long low,long high,long mid);

int main(){
    srand(time(NULL));
    int n=1000;
    long* inputArray = new long[n];
    for (long i=0;i<n;i++){   //initialize the arrays of size n with random n numbers
        inputArray[i]=rand();  //Generate a random number
    }
    auto Start = std::chrono::high_resolution_clock::now(); //Set the start time for insertion_sort
    merge_sort(inputArray,0,n); //calling the insertion_sort to sort the array of size n
    auto End = std::chrono::high_resolution_clock::now(); //Set the end time for insertion_sort
    cout<<endl<<endl<<"Time taken for Merge Sort = "<<std::chrono::duration_cast<std::chrono::microseconds>(End-Start).count()<<" microseconds";  //Display the time taken for insertion sort
    delete []inputArray;
    return 0;
}

void merge_sort(long* inputArray,long low,long high){
    if (low<high){
        int mid =(low+high)/2;
        merge_sort(inputArray,low,mid);
        merge_sort(inputArray,mid+1,high);
        merge(inputArray,low,mid,high);
    }
    return;
}

void merge(long* inputArray,long low,long mid,long high){
    long n1 = mid-low+1;
    long n2 = high - mid;
    long *L= new long [n1+1];
    long *R=new long [n2+1];
    for (int i=0;i<=n1;i++){
        L[i] = inputArray[low+i];

    }
    for (int j=0;j<=n2;j++){
        R[j] = inputArray[mid+j+1];
    }
    L[n1]=INT_MAX ;
    R[n2]=INT_MAX;
    long i=0;
    long j=0;
    for (long k=low;k<=high;k++){
        if (L[i] <= R[j] ){
            inputArray[k]=L[i];
            i=i+1;
        }
        else{
            inputArray[k]=R[j];
            j=j+1;
        }
    }

    delete[] L;
    delete[] R;
}

1 个答案:

答案 0 :(得分:3)

两次测量都不需要20秒。

正如其他人所指出的,结果将真正依赖于平台,编译器优化(调试模式可能真的比发布模式慢)等等。

如果您的设置与朋友相同,但仍然存在性能问题,则可能需要使用分析器查看代码花费时间的位置。如果你在Linux中,你可以使用that tool,否则windows中的visual studio是一个很好的选择。