数据结构与算法——插入排序以及C++函数模板实现
2016-01-06 22:57
507 查看
插入排序思路就是:(采用从小到大排序,从大到小排序意思一样)
1:直接插入第一个元素。2:再插入第二个元素,并将第二个元素与之前的元素比较,如果比之前的元素小,则之前的元素向后移动一个位置。
3:再插入第三个元素,并将第三个元素与之前的元素比较,如果比之前的元素小,则之前的元素向后移动一个位置,直到比较到大于某个元素或到最前面的元素的位置为止。
实例1:简单实现,默认从小到大排序
/************************************************************************* > File Name: insert_sort.cpp > Author: > Mail: > Created Time: 2016年01月06日 星期三 22时31分28秒 ************************************************************************/ #include <iostream> #include <vector> using namespace std; void input_data(vector<int> & data) { cout << "输入的数据序列:"; int tmp; while(cin >> tmp){ data.push_back(tmp); } } void insert_sort(vector<int> & data) { int j; for (int i = 1; i < data.size(); ++i){ int tmp = data[i]; for (j = i; j > 0 && tmp < data[j-1]; j--){ data[j] = data[j-1]; } data[j] = tmp; } } void output_data(vector<int> & data) { cout << "排序的数据序列:"; for (int i = 0; i < data.size(); ++i){ cout << data[i] << " "; } cout << endl; } int main() { vector<int> data; input_data(data); insert_sort(data); output_data(data); return 0; }
实例2:实现插入排序函数模板,默认是从小到大,不提供可选的排序顺序。
/************************************************************************* > File Name: insert_sort.cpp > Author: > Mail: > Created Time: 2016年01月06日 星期三 22时31分28秒 ************************************************************************/ #include <iostream> #include <vector> #include <string> using namespace std; template<class Obj> void input_data(vector<Obj> & data) { cout << "输入的数据序列:"; Obj tmp; while(cin >> tmp){ data.push_back(tmp); } } template<class Iterator, class Obj> void insert_sort_help(const Iterator & begin, const Iterator & end, const Obj & obj) { Iterator j; for (Iterator i = begin+1; i != end; ++i){ Obj tmp = *i; for (j = i; j != begin && tmp < *(j-1); j--){ *j = *(j-1); } *j = tmp; } } template<class Iterator> void insert_sort(const Iterator & begin, const Iterator & end) { /* int j; for (int i = 1; i < data.size(); ++i){ int tmp = data[i]; for (j = i; j > 0 && tmp < data[j-1]; j--){ data[j] = data[j-1]; } data[j] = tmp; }*/ insert_sort_help(begin, end, *begin); } template<class Iterator> void output_data(const Iterator & begin, const Iterator & end) { cout << "排序的数据序列:"; for (Iterator it = begin; it != end; ++it){ cout << *it << " "; } cout << endl; } int main() { /* vector<int> data; input_data(data); insert_sort(data.begin(), data.end()); output_data(data.begin(), data.end()); */ vector<string> str_data; input_data(str_data); insert_sort(str_data.begin(), str_data.end()); output_data(str_data.begin(), str_data.end()); return 0; }
实例3:实现插入排序函数模板,提供可选的排序顺序。
/************************************************************************* > File Name: insert_sort.cpp > Author: > Mail: > Created Time: 2016年01月06日 星期三 22时31分28秒 ************************************************************************/ #include <iostream> #include <vector> #include <string> #include <functional> using namespace std; template<class Obj> void input_data(vector<Obj> & data) { cout << "输入的数据序列:"; Obj tmp; while(cin >> tmp){ data.push_back(tmp); } } template<class Iterator, class Obj, class Comparator> void insert_sort_help(const Iterator & begin, const Iterator & end, const Obj & obj, const Comparator &comp) { Iterator j; for (Iterator i = begin+1; i != end; ++i){ Obj tmp = *i; //for (j = i; j != begin && tmp < *(j-1); j--){ for (j = i; j != begin && comp(tmp, *(j-1)); j--){ *j = *(j-1); } *j = tmp; } } template<class Iterator, class Comparator> void insert_sort(const Iterator & begin, const Iterator & end, const Comparator & comp) { /* int j; for (int i = 1; i < data.size(); ++i){ int tmp = data[i]; for (j = i; j > 0 && tmp < data[j-1]; j--){ data[j] = data[j-1]; } data[j] = tmp; }*/ insert_sort_help(begin, end, *begin, comp); } template<class Iterator> void output_data(const Iterator & begin, const Iterator & end) { cout << "排序的数据序列:"; for (Iterator it = begin; it != end; ++it){ cout << *it << " "; } cout << endl; } int main() { #if 1 vector<int> data; input_data(data); cout << "从小到大排序,"; insert_sort(data.begin(), data.end(), less<int> ());//从小到大排序 output_data(data.begin(), data.end()); cout << "从大到小排序,"; insert_sort(data.begin(), data.end(), greater<int> ());//从大到小排序 output_data(data.begin(), data.end()); #else vector<string> str_data; input_data(str_data); cout << "从小到大排序,"; insert_sort(str_data.begin(), str_data.end(), less<string> ());//从小到大排序 output_data(str_data.begin(), str_data.end()); cout << "从大到小排序,"; insert_sort(str_data.begin(), str_data.end(), greater<string> ());//从大到小排序 output_data(str_data.begin(), str_data.end()); #endif return 0; }
相关文章推荐
- 三种改进型排序算法-快速排序,堆排序,希尔排序
- 《挑战程序设计竞赛》3.3.2 数据结构-线段树和平方分割 POJ2991 3264 2104 3468 3368 3470 1201 UVA11990(4)
- 《挑战程序设计竞赛》3.3.1 数据结构-树状数组 POJ3468 1804 1990 3109 2155 2886(4)
- 数据结构_一元稀疏(加减乘法)计算器
- 字典树两种写法....
- OpenMesh学习笔记3 半边数据结构
- Scalaz(23)- 泛函数据结构: Zipper-游标定位
- Scalaz(23)- 泛函数据结构: Zipper-游标定位
- 数据结构基础--线性表操作
- mysql索引之二:数据结构及算法原理
- opencv 基本数据结构
- 22.cocos2d-x数据结构
- 暑假集训-数据结构
- openCV-cvMat数据结构
- Objective-C数据结构
- Objective-C数据结构
- 数据结构与算法——二分查找算法
- 数据结构 JAVA描述(十四) 静态查找表
- 数据结构时间复杂度
- 数据结构——bitmap