c++ - 为什么我的合并排序代码比插入排序慢

标签 c++ algorithm sorting mergesort insertion-sort

我一直在尝试进行归并排序和插入排序,并比较两者的时间结果。 并且从数组输入大小 10 到 10000 合并排序一直比插入排序慢

这是插入排序的代码

vector<int> insertion_sort(vector<int> vec)
{
    for(int i = 1 ; i <vec.size();i++)
    {
        int j = i-1;
        while(j>=0 && vec[j+1]<vec[j] )
        {
            int x = vec[j+1];
            vec[j+1] = vec[j];
            vec[j--] = x;
        }
    }
    return vec;
}

这是合并排序代码

vector<int> merge(vector<int> left,vector<int> right)
{
    int i = 0;
    int j = 0;
    vector<int> ret(left.size()+right.size());
    int it = 0;
    for(; i <left.size() && j<right.size();)
    {
        if(left[i]<right[j])
            ret[it++]=(left[i++]);
        else if(right[j]<left[i])
            ret[it++]=(right[j++]);
        else ret[it++]=(left[i++]),ret[it++]=(right[j++]);
    }
    for(;i<left.size();)
        ret[it++]=(left[i++]);
    for(;j<right.size();)
        ret[it++]=(right[j++]);
    return ret;
}
vector<int> merge_sort(vector<int> A,int start,int end)
{
    if(start >= end) 
    {
        vector<int> v(1);
        v[0]=(A[start]);
        return v;
    }
    int mid = (start+end )/ 2;
    vector<int> left = merge_sort(A,start,mid);
    vector<int> right = merge_sort(A,mid+1,end);
    return merge(left,right);
}

最后这就是我调用它们并计算时间的方式

int main()
{
    vector<int> rand_vec;

    srand(time(0));
    for(int i = 0 ; i <SIZE;i++)
    {
        rand_vec.push_back(rand()%SIZE);
    }
    int t = clock();
    vector<int> merge_sorted = merge_sort(rand_vec,0,rand_vec.size()-1);
    puts("");
    printf("merge sort time = %d\n",clock() - t );


    t = clock();
    vector<int> insertion_sorted = insertion_sort(rand_vec);
    puts("");
    printf("insertion sort time = %d\n",clock() - t );
    return 0;
}

我想知道我是否在该代码中做错了什么,使合并排序的时间比插入排序的时间多。

谢谢。

最佳答案

通过引用而不是通过值传递 vector 会产生巨大的差异。在我的机器上,SIZE=50000,用 -O3 编译,之前:

merge sort time = 5730000

insertion sort time = 1470000

之后:

merge sort time = 10000

insertion sort time = 1470000

我只改了两行:

vector<int> merge(const vector<int> &left,const vector<int> &right)
vector<int> merge_sort(const vector<int> &A,int start,int end) 

关于c++ - 为什么我的合并排序代码比插入排序慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329425/

相关文章:

java - 对冒泡排序算法进行正确的运行时分析

ios - 对 X 和 Y 顶点数组进行排序? iOS/Objective-C

c++ - 如何关闭套接字

c++ - 静态内存分配和自动内存分配有什么区别吗?

从 Excel VBA/Python 调用时,C++ dll 返回不同的结果

c++ - 表达式 *(int*)a 是什么意思?

algorithm - 矩阵乘法子问题图顶点度

python - 在 python 中对相似词进行分组的最佳方法是什么?

android - 在 android 日期和其他字符串中排序 arraylist

JAVA : ZK framework Sorting and Manual Paging