比较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; }