C ++数组与矢量排序(在我的情况下,矢量比数组慢2.5倍(无优化))

时间:2018-09-26 06:10:36

标签: c++ arrays sorting vector

我正在对100000元素进行插入排序。我写了两个函数。

1-在这种情况下,我将要排序的向量复制到数组中,然后应用排序,然后将数组复制回向量以进行返回。

2-在这种情况下,我将排序应用于给定的向量,然后将其返回。

据我所知,向量还可以动态创建一个数组,并且C ++ Vector []运算符速度的差异应该不存在或不应该那么大。因此,方法2应该比方法1更快。但是令我惊讶的是相反。我试图找到一个具体的答案,而不只是数组更快。 :)

编译器版本=> gcc版本6.2.0(Rev2,由MSYS2项目构建) g ++ main.cpp -o main

#include <time.h>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

vector<long> InsertionSort1(vector<long> nums){
    int vsize = nums.size();
    long* arr = new long[vsize];
    int swap, j;

    // Coping the vector to an array
    for(int i=0;i<vsize;i++){
        arr[i] = nums[i];
    }

    //sorting
    for(int i=1;i<vsize;i++){
        swap = arr[i];
        j = i-1;
        while(j>=0 && arr[j] > swap){
            arr[j+1] = arr[j];
            j--; 
        }

        arr[j+1] = swap;   

    }

    // Coping the array back to vector
    for(int i=0;i<vsize;i++){
        nums[i] = arr[i];
    }

    return nums;
}

vector<long> InsertionSort2(vector<long> nums){
    int vsize = nums.size();
    int swap, j;

    for(int i=1;i<vsize;i++){
        swap = nums[i];
        j = i-1;
        while(j>=0 && nums[j] > swap){
            nums[j+1] = nums[j];
            j--; 
        }

        nums[j+1] = swap;   

    }

    return nums;
}

int main(){

    vector<long> entries;
    for(int i=0;i<100000;i++){
        entries.push_back(rand()%100000);
    }

    double start = time(0);
    InsertionSort1(entries);
    double end = time(0);

    cout<<"With Array => "<<end-start<<endl;

    start = time(0);
    InsertionSort2(entries);
    end = time(0);

    cout<<"With Vector => "<<end-start<<endl;
}

以上代码的结果为:

With Array 100000 => 8
With Vector 100000 => 19

1 个答案:

答案 0 :(得分:2)

我认为衡量绩效是一件好事! std::chrono::high_resolution_clockgoogle benchmark是更适合该工作的工具。

您需要启用一个适当的优化级别,例如-O3,以获得有意义的结果。

您为什么喜欢实施排序算法。我将您的方法与std::sort进行了比较?出于学术目的,这很好,否则您需要有充分的理由并有充分的证据证明您做得更好。

  

使用数组=> 2.55608

     

使用Vector => 1.74857

     

使用std :: sort => 0.00657156

#include <time.h>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

vector<long> InsertionSort1(vector<long> nums){
    int vsize = nums.size();
    long* arr = new long[vsize];
    int swap, j;

    // Coping the vector to an array
    for(int i=0;i<vsize;i++){
        arr[i] = nums[i];
    }

    //sorting
    for(int i=1;i<vsize;i++){
        swap = arr[i];
        j = i-1;
        while(j>=0 && arr[j] > swap){
            arr[j+1] = arr[j];
            j--; 
        }

        arr[j+1] = swap;   

    }

    // Coping the array back to vector
    for(int i=0;i<vsize;i++){
        nums[i] = arr[i];
    }
    // delete of is missing arr;
    return nums;
}

vector<long> InsertionSort2(vector<long> nums){
    int vsize = nums.size();
    int swap, j;

    for(int i=1;i<vsize;i++){
        swap = nums[i];
        j = i-1;
        while(j>=0 && nums[j] > swap){
            nums[j+1] = nums[j];
            j--; 
        }

        nums[j+1] = swap;   

    }

    return nums;
}

int main(){

    vector<long> entries;
    for(int i=0;i<100000;i++){
        entries.push_back(rand()%100000);
    }

    double start = time(0);
    InsertionSort1(entries);
    double end = time(0);

    cout<<"With Array => "<<end-start<<endl;

    start = time(0);
    InsertionSort2(entries);
    end = time(0);

    cout<<"With Vector => "<<end-start<<endl;
}