箱子排序
题意:假设学生考试分数有0-100分或者A.B.C.D.F五种成绩,让同学按成绩排序(升序或降序)。
箱子排序 是为了让所需时间比普通算法更快。
箱子排序简述:将分数设置为6个等第,0-5分,姓名设为一个字符,有10个学生。
链表结构有,学生的成绩的指针,指向0-5分。将6种成绩当作6个箱子。先把每个学生根据成绩放
在对应箱子中,再按箱子成绩0-5的顺序,一个个将箱子内的元素取出放在队列(链表)中。
- struct studentRecord
- {
- int score;
- string * name; // 定义好2个基本成员,还有重载3个函数。
- int operator != (const studentRecord & x) const { return (score != x.score);}
- operator int( ) const {return score;}
- }
- ostream & operator << (ostream & out, const studentRecord & x)
- {out << x.score<< ' ' << *x.name << endl; return out; }
上面这些是准备工作,算法的逻辑还未体现。
- Void binSort (chain <studentRecord> & the chain , int range)
- chain <studentRecord> * bin ;
- bin = new chain<studentRecord> [range +1]; //range 是代表成绩范围,或者说箱子的数量。
- // 这一块代码是核心,把学生的成绩从链表取出,并分配进相应成绩的箱子。
- int numberOfElements = theChain.size();
- for ( int i =0; i < numberOfElements; i++)
- {
- studentRecord x = theChain.get(0); // 0是迭代器的位置。把学生数据从“原始链”取出
- theChain.erase(0); // 把theChain 的第一个元素清除,所以for循环不依赖 " i "可以成立。
- bin.[x.score].insert(0,x); // 根据x 对象的 成绩,来选择bin[ ],insert到头位置。
- }
- for ( int j = range; j> = 0; j-- ) //这里2重循环,range 是代表箱子数量,
- while ( ! bin[ j ] .empty() ) // 这里是把每个 bin[ ] 里的所有对象倒出来。
- {
- studentRecord x= bin [ j ] .get( 0 );
- bin [ j ] .erase(0);
- theChain.insert ( 0, x); 把bin[] 里的数据 调出,按bin 的顺序放入"theChain”,完成排序。
- }
- delete [ ] bin ;
- }
人生第一个算法。记录一下。