有一种方法可以随机生成大量元素...... 10000,100000甚至1000000个元素,然后使用我的插入排序算法。我正在尝试使用大量元素并使用插入排序将它们按顺序排列,然后也按相反的顺序排列。接下来,我使用time.h文件中的clock()来计算每个算法的运行时间。我试图用大量数字进行测试。
#define ELEMENTS 25
void insertion_sort(int x[],int length);
void insertion_sort_reverse(int x[],int length);
int main()
{
clock_t tStart = clock();
int B[ELEMENTS]={4,2,5,6,1,3,17,14,67,45,32,66,88,
78,69,92,93,21,25,23,71,61,59,60,30};
int x;
cout<<"Not Sorted: "<<endl;
for(x=0;x<ELEMENTS;x++)
cout<<B[x]<<endl;
insertion_sort(B,ELEMENTS);
cout <<"Sorted Normal: "<<endl;
for(x=0;x<ELEMENTS;x++)
cout<< B[x] <<endl;
insertion_sort_reverse(B,ELEMENTS);
cout <<"Sorted Reverse: "<<endl;
for(x=0;x<ELEMENTS;x++)
cout<< B[x] <<endl;
double seconds = clock() / double(CLK_TCK);
cout << "This program has been running for " << seconds << " seconds." << endl;
system("pause");
return 0;
}
答案 0 :(得分:13)
#include <random> // mt19937 and uniform_int_distribution
#include <algorithm> // generate
#include <vector> // vector
#include <iterator> // begin, end, and ostream_iterator
#include <functional> // bind
#include <iostream> // cout
std::vector<int> create_random_data(int n) {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed); // a source of random data
std::uniform_int_distribution<int> dist;
std::vector<int> v(n);
generate(begin(v), end(v), bind(dist, eng));
return v;
}
int main() {
auto random_data = create_random_data(100000);
std::cout << "unsorted: ";
copy(begin(random_data), end(random_data),
std::ostream_iterator<int>(std::cout, "\n"));
}
generate
是一种通用算法,它使用仿函数生成的值填充范围。在这种情况下,我们为它提供了一个函子,它使用我们的随机数据源来生成随机数,我们提供了一个与容器相对应的范围,我们可以在generate
填充数据之后使用它。
我们正在使用std::mt19937
和std::uniform_int_distribution
,C ++ 11中的标准C ++工具(在VS2010中可用),以创建随机数而不是旧的std::rand()
和{ {1}}因为较新的方法更容易正确使用,质量更高,更灵活。
如果您使用的是VS2012或更高版本,则可以使用C ++ 11时间库。
std::srand()
答案 1 :(得分:3)
而不是
void insertion_sort(int x[],int length);
void insertion_sort_reverse(int x[],int length);
int B[ELEMENTS]={4,2,5,6,1,3,17,14,67,45,32,66,88,
78,69,92,93,21,25,23,71,61,59,60,30};
试
void insertion_sort(std::vector<int>& x);
void insertion_sort_reverse(std::vector<int>& x);
srand(NULL);
std::vector<int> B(num_elements); //num_elements can be a variable
std::generate(B.begin(), B.end(), rand);
与任务有关而不是问题:
你想要连续两次运行每个排序,第一个没有计时,第二个计时
你的测试不公平,因为一个从一个随机位置开始,另一个从一个排序位置开始
你的时间安排包括IO,IO总是很慢(cout
)
std::endl
强制程序立即将所有输出提供给操作系统,使用'\n'
您显示的是完全无关的秒数。
int main()
{
srand(NULL);
std::vector<int> B(num_elements); //num_elements can be a variable
std::generate(B.begin(), B.end(), rand);
std::vector<int> C(B); //make a copy of the data
std::cout << "Not Sorted:" << '\n';
for(int i=0;i<B.size();i++)
cout<<B[i]<<'\n';
clock_t tStart0 = clock();
insertion_sort(B,ELEMENTS);
clock_t tStop0 = clock();
cout <<"Sorted Normal: "<<'\n';
for(int i=0;i<B.size();i++)
cout<< B[i] <<'\n';
clock_t tStart1 = clock();
insertion_sort_reverse(C);
clock_t tStop1 = clock();
cout <<"Sorted Reverse: "<<'\n';
for(int i=0;i<C.size();i++)
cout<< C[i] <<'\n';
double seconds = (tStop1-tStart1 + tStop0-tStart0) / double(CLK_TCK);
cout << "This program has been running for " << seconds << " seconds." << endl;
system("pause");
return 0;
}
答案 2 :(得分:0)
对于C ++ 11,我使用时间值作为初始随机种子来生成任意数量的随机数据。
请参阅以下示例代码
#include <iostream>
#include <random>
#include <chrono>
#include <functional>
#include <iterator>
constexpr auto MAX = 20;
int main(int argc, char* argv[]) {
std::default_random_engine re(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> uid(0, MAX);
int nums[MAX] {};
std::generate(nums, nums+MAX, std::bind(uid, re));
// apply sort algorithm
std::copy(nums, nums+MAX, std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
return 0;
}