比较C++和C实现直接插入排序和二分插入排序效率!
注:之前没有发现这其实是两个不同算法,现在更正下。
下面用C++实现二分插入排序和C实现直接插入排序,明天会继续测试下C++实现直接插入排序和C实现二分插入排序
下面是几次的输出结果:
(C)Total seconds time taken by CPU: 119.920000
(C++)seconds time: 14.92
(C)Total seconds time taken by CPU: 118.190000
(C++)seconds time: 14.53
(C)Total seconds time taken by CPU: 118.660000
(C++)seconds time: 14.52
C实现直接插入排序代码:
(linux下编译 g++ test.cpp -o test执行./test)
#include <stdio.h>
#include <time.h>
#define GETCOUNT(x) (sizeof(x) / sizeof((x)[0]))
void InsertionSort(int *a, int n) {
int tmp,j;
for(int i = 1; i < n; ++i) {
tmp = a[i];
j = i;
while(j > 0 && tmp < a[j - 1]) {
a[j] = a[j - 1];
j--;
}
a[j] = tmp;
}
}
void Print(int *a, int n)
{
for (int i = 0; i < n; i++)
printf("%d%s", a[i], i == n - 1 ? "\n" : " ");
}
int main () {
clock_t start_t, end_t;
start_t = clock();
printf("Starting of the program, start_t = %ld\n", start_t);
int a[200000];
for(int i=0;i<200000;i++)
{
a[i]=100-i;
}
int n = GETCOUNT(a);
int i;
//Print(a, n);
InsertionSort(a, n);
//Print(a, n);
end_t = clock();
printf("End of the function, end_t = %ld\n", end_t);
double total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
printf("Total seconds time taken by CPU: %f\n", total_t );
return 0;
}
C++实现二分插入排序代码:
(linux下编译 g++ -std=c++11 test2.cpp -o test2执行./test2)
#include <algorithm>
#include <iostream>
#include <iterator>
#include <ctime>
//See the code in :http://en.cppreference.com/w/cpp/algorithm/rotate
template <typename RandomAccessIterator>
void InsertionSort(RandomAccessIterator begin, RandomAccessIterator end) {
for (auto i = begin; i != end; ++i) {
std::rotate(std::upper_bound(begin, i, *i, std::less<typename std::iterator_traits<RandomAccessIterator>::value_type>()), i, i + 1);
}
}
int main() {
int start_s=clock();
int a[200000];
for(int i=0;i<200000;i++)
{
a[i]=100-i;
}
//copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
InsertionSort(std::begin(a), std::end(a));
//copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
int stop_s=clock();
std::cout << "seconds time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC) << "\n";
return 0;
}