merge函数
void merge(vector<int> &vec, int lo, int mid, int hi) {
vector<int> save;
std::copy(vec.begin(), vec.end(), back_inserter(save));
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
if (i > mid) vec[k] = save[j++];
else if (j > hi) vec[k] = save[i++];
else if (save[i] > save[j]) vec[k] = save[j++];
else vec[k] = save[i++];
}
}
递归方式
void merge_sort(vector<int> &vec, int lo, int hi) {
if (lo < hi) {
int mid = (lo + hi) / 2;
merge_sort(vec, lo, mid);
merge_sort(vec, mid + 1, hi);
merge(vec, lo, mid, hi);
}
}
迭代方式
void merge_sort(vector<int> &vec, int lo, int hi) {
for (int seg = 1; seg < vec.size(); seg += seg)
for (int i = lo; i < vec.size() - seg; i += seg + seg){
int lo = min(i, vec.size());
int mid = min(i + seg - 1, vec.size());
int hi = min(i + 2 * seg -1, vec.size() - 1);
merge (vec, lo, mid, hi);
}
}