箱子排序
箱子排序的思想简单而言就是分配range(比如[0,9],range=10)个箱子,然后把每个相同的元素放入一个箱子,最后把箱子连接起来得到新的有序的线性表。箱子排序是一种稳定排序,它不会改变排序前线性表中相同元素的相对次序。
虽然可以用数组来表示箱子,但是涉及到箱子的合并(链表的合并操作为Θ(1)),我们使用单向链表来实现使其更高效。单向链表的定义实现见线性表–单向链表的C++描述。
用于箱子排序的一个结构体例子
因为使用到我们定义的链表,因此用于箱子排序的类型T必须实现对成员函数operator size_t()
和bool operator!=()
运算符的重载。另外我们还需要对类型T实现operator<<
运算符的重载。
//========================箱子排序========================
//用于排序的一个结构体例子
//链表中的T必须拥有定义的 operator int() 和 operator!= 和 opeartor<<的重载操作
struct studentRecord{
studentRecord(string _name,int _score):name(_name),score(_score){
}
string name;//学生姓名
int score;//学生成绩
operator int()const {
//将类转换成int用于箱子排序
return score;
}
bool operator!=(const studentRecord& rhs)const {
return score != rhs.score;
}
};
std::ostream& operator<<(std::ostream&os, const studentRecord& sr) {
os << "student name:" << sr.name << " socre=" << sr.score << endl;
return os;
}
使用链表的多个方法进行箱子排序
//=======================binSort=======================
//用链表的多个方法进行箱子排序
template <typename T>
void binSort(myExtendedChainList<T>& chain