您的位置:首页 > 编程语言 > C语言/C++

归并排序使用在c++STL实现

2016-07-07 21:36 405 查看
相比上一个C++归并排序的版本,这次复习了一下STL的基本方法

因为要使用随机访问迭代器,所以序列使用了vector容器,而要使用lis容器t的merge算法,因此在合并时使用了list容器和vector容器之间相互转换

不过让我疑惑的是,似乎VS2013上迭代器不能重载[]运算符?

#include<iostream>
#include<list>
#include<vector>
#include<algorithm>

template<typename T>
void MergeSort(std::vector<T> <, int p, int r);
template<typename T>
void Merge(std::vector<T> <, int p, int q, int r);

int main()
{
using namespace std;
vector<int> lt{9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
for (auto &x : lt)
cout << x << " ";
cout << "\n";
MergeSort(lt, 0, lt.size()-1);
for (auto &x : lt)
cout << x << " ";
cout << "\n";
return 0;
}

template<typename T>
void MergeSort(std::vector<T> <, int p, int r)
{
int q;
if (p < r)
{
q = (p + r) / 2;
MergeSort(lt, p, q);
MergeSort(lt, q + 1, r);
Merge(lt, p, q, r);
}
}

template<typename T>
void Merge(std::vector<T> <, int p, int q, int r)
{
std::list<T> lt1(q - p + 1);
std::list<T> lt2(r - q);
std::copy(lt.begin() + p, lt.begin() + q + 1, lt1.begin());
std::copy(lt.begin() + q + 1, lt.begin() + r + 1, lt2.begin());
lt1.merge(lt2);
std::copy(lt1.begin(), lt1.end(), lt.begin() + p);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息