插入排序算法,c++ 模板技术表述,完全兼容标准库容器!!!
这里用到c++ STL中traits机制。
为了清晰的表述,用两个文件。
贴代码!!!
#pragma once
#include<iterator> // std::iterator_traits
namespace mystd{
//此函数可以很好地与标准库兼容
//升序排列
template<class random_access_iterator> // 随机访问迭代器
void insert_sort(random_access_iterator first,random_access_iterator last)
{ //利用traits机制
typedef typename std::iterator_traits<random_access_iterator>::value_type value_type;
std::size_t n = last - first;
if(n == 0 || n == 1) return ;
random_access_iterator left = first;
while(++left != last)
{
if(*(left - 1) <= *left)
continue;
else
{
value_type temp_val = *left;
random_access_iterator ptr = left;
while(ptr != first) //回溯查找合适的位置
{
if(*(ptr - 1) <= temp_val) //表明已经找到,退出循环
break;
else
{
*ptr = *(ptr - 1);
ptr--; //继续回溯
}
}
*ptr = temp_val; //将保存的值放到正确的位置
}
}
}
} // end of namespace mystd
下面是一个简单的测试程序!上面的头文件命名为"test.h"
#include<iostream>
#include"test.h"
#include<vector>
#include<cstdlib> // rand()
using std::cout;
using std::endl;
int main()
{
const int mn = 10;
std::vector<int> my;
for(int i = 0; i < mn; ++i)
my.push_back(rand() % 10000); //利用随机数
cout<<"不排序的情况:"<<endl;
for(int i = 0; i < mn; ++i)
cout<<my[i]<<"\t";
cout<<endl;
cout<<"排序的情况:"<<endl;
//传入迭代器
mystd::insert_sort(my.begin(),my.end());
for(int i = 0; i < mn; ++i)
cout<<my[i]<<"\t";
cout<<endl;
system("pause");
return 0;
}