iterative-mergesort

来源:互联网 发布:交换机每个端口的带宽 编辑:程序博客网 时间:2024/06/07 07:10
function iterative-mergesort(a[1...n])Input: elements a1, a2, ..., an to be sortedQ = [ ] (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;}
原创粉丝点击