再请教一下,如果不用sort函数,自己编个按name从小到大的排序函数,应该怎么编写?用冒泡排序法。

如题所述

嗯,如果要给链表写排序的确得稍微换点方式,特别是标准库的链表还得用迭代器。

这是一个手写简单版:
void sortlist(list<person>& l)
{
list<person>::iterator pos1,pos2;

bool moved = true;
while(moved)
{
moved = false;
pos1 = pos2 = l.begin();
++pos2;
while(pos2 != l.end())
{
if((pos2->name) < (pos1->name))
{
person tmp = *pos2;
*pos2 = *pos1;
*pos1 = tmp;
moved = true;
}
++pos1;
++pos2;
}
}
}
调用的时候直接:sortlist(l);就可以了。当然这个是只适用于你的那个list<person> l类型的定义的。

当然可以用模板把上述函数写的更通用些,适用于各种list:
template<typename ListT>
void sortlist(ListT& l)
{
typename ListT::iterator pos1,pos2;

bool moved = true;
while(moved)
{
moved = false;
pos1 = pos2 = l.begin();
++pos2;
while(pos2 != l.end())
{
if((*pos2) < (*pos1))
{
typename ListT::value_type tmp = *pos2;
*pos2 = *pos1;
*pos1 = tmp;
moved = true;
}
++pos1;
++pos2;
}
}
}
当然这个通用版本的排序就和标准库的一样,要求你的元素能自己支持比较运算才行了。
----------------------
不过建议还是尽量使用list自带的sort函数,毕竟那个效率和可靠性都好很多。来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-04
用VBA编写自定义函数