归并排序使用在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);
}
因为要使用随机访问迭代器,所以序列使用了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);
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解