我正在对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
答案 0 :(得分:2)
我认为衡量绩效是一件好事! std::chrono::high_resolution_clock
或google 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;
}