您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法——插入排序以及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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: