#include <iostream>
#include <vector>
#include <stdlib.h>
#include <chrono>
#include <cmath>
#include <algorithm>
template <typename T>
inline void swap(T * t1, T * t2) {
T tmp = *t1;
*t1 = *t2;
*t2 = tmp;
}
template <typename T>
void mergesort(std::vector<T> & vec) {
if (vec.size() == 1) {
return;
}
if (vec.size() == 2) {
if(vec[0] > vec[1]) {
swap(&vec[0], &vec[1]);
}
return;
}
auto Index = (vec.size() - 1)/ 2;
std::vector<T> vec1 = {vec.begin(), vec.begin() + Index};
std::vector<T> vec2 = {vec.begin() + Index, vec.end()};
mergesort(vec1);
mergesort(vec2);
// insert
int index1 = 0, index2 = 0, index = 0;
while(true) {
if(index == vec.size() ) {
break;
}
if(index1 == vec1.size()) {
while(index2 < vec2.size()) {
vec[index++] = vec2[index2++];
}
}
else if(index2 == vec2.size()) {
while(index1 < vec1.size()) {
vec[index++] = vec1[index1++];
}
}
else if(vec1[index1] < vec2[index2]) {
vec[index++] = vec1[index1++];
} else {
vec[index++] = vec2[index2++];
}
}
}
void genertor(std::vector<int> &vec, int max) {
for (auto & item : vec) {
item = rand() % max;
}
}
int main() {
std::vector<int> vec;
auto size = 10;
vec.resize(size);
genertor(vec, size);
std::cout << "before sort: ";
std::for_each(vec.cbegin(), vec.cend(), [](const int & n) { std::cout << " " << n;});
auto startTime = std::chrono::high_resolution_clock::now();
mergesort(vec);
auto endTime = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> diffTime = endTime - startTime;
std::cout << std::endl << "after sort: ";
std::for_each(vec.cbegin(), vec.cend(), [](const int & n) { std::cout << " " << n;});
std::cout << std::endl << "size: " << size << ", quick sort timecost = " << diffTime.count() << "ms" << std::endl;
return 0;
}
运行
before sort: 7 9 3 8 0 2 4 8 3 9
after sort: 0 2 3 3 4 7 8 8 9 9
size: 10, quick sort timecost = 0.006777ms