function iterative-mergesort(a[1...n])
Input: elements a1, a2, ..., an to be sorted
Q = [ ] (empty queue)
for i = 1 to n:
inject(Q, [ai])
while |Q| > 1:
inject(Q, merge(eject(Q), eject(Q)))
return eject(Q)
上面是课本的伪代码,下面简单实现一下:
这个算法和平常的mergesort不同的是,它直接从单个元素的merge开始,一直merge成一个数组,减少了不断递归到单个元素才merge的过程。
#include<bits/stdc++.h>
using namespace std;
vector<int> merge(vector<int> & x, vector<int> & y) {
vector<int> ret;
int i = 0, j = 0;
while (i < x.size() && j < y.size()) {
if (x[i] < y[j]) {
ret.push_back(x[i]);
i++;
} else {
ret.push_back(y[j]);
j++;
}
}
while (i < x.size()) {
ret.push_back(x[i]);
i++;
}
while (j < y.size()) {
ret.push_back(y[j]);
j++;
}
return ret;
}
vector<int> mergesort(vector<int> & vec) {
queue<vector<int>> que;
for (int i = 0; i < vec.size(); i++) {
vector<int> v(1, vec[i]);
que.push(v);
}
while (que.size() > 1) {
vector<int> v1(que.front());
que.pop();
vector<int> v2(que.front());
que.pop();
que.push(merge(v1, v2));
}
return que.front();
}
int main() {
int arr[] = {3, 2, 4, -1, 2, 0, 8, 5, 9};
vector<int> v(arr, arr + sizeof(arr)/sizeof(int));
v = mergesort(v);
for (auto val : v)
cout << val << " ";
cout << endl;
return 0;
}