【C++算法】箱子排序----链表的运用

箱子排序

题意:假设学生考试分数有0-100分或者A.B.C.D.F五种成绩,让同学按成绩排序(升序或降序)。

箱子排序 是为了让所需时间比普通算法更快。

箱子排序简述:将分数设置为6个等第,0-5分,姓名设为一个字符,有10个学生。

链表结构有,学生的成绩的指针,指向0-5分。将6种成绩当作6个箱子。先把每个学生根据成绩放

在对应箱子中,再按箱子成绩0-5的顺序,一个个将箱子内的元素取出放在队列(链表)中。

  1. struct studentRecord
  2. {   
  3.         int score;
  4.        string * name;    // 定义好2个基本成员,还有重载3个函数。
  5.        int operator != (const studentRecord & x) const { return (score != x.score);}
  6.        operator int( ) const {return score;}
  7. }
  8. ostream & operator << (ostream & out, const studentRecord & x)
  9. {out << x.score<< '  ' << *x.name << endl; return out; } 

上面这些是准备工作,算法的逻辑还未体现。

  1. Void binSort (chain <studentRecord> & the chain , int range)
  2. chain <studentRecord> * bin ;
  3. bin = new chain<studentRecord> [range +1];     //range 是代表成绩范围,或者说箱子的数量。
  4. // 这一块代码是核心,把学生的成绩从链表取出,并分配进相应成绩的箱子。
  5. int numberOfElements = theChain.size(); 
  6. for ( int i =0; i < numberOfElements; i++)
  7. {
    1. studentRecord x = theChain.get(0);      // 0是迭代器的位置。把学生数据从“原始链”取出
    2. theChain.erase(0);                 // 把theChain 的第一个元素清除,所以for循环不依赖 " i "可以成立。
    3. bin.[x.score].insert(0,x);         // 根据x 对象的 成绩,来选择bin[   ],insert到头位置。
  8. }
  9. for ( int j = range; j> = 0; j-- )                                 //这里2重循环,range 是代表箱子数量,
    1. while ( ! bin[ j ] .empty() )                             //  这里是把每个 bin[ ] 里的所有对象倒出来。
    2. {
      1. studentRecord x= bin [ j ] .get( 0 );
      2. bin [ j ] .erase(0);
      3. theChain.insert ( 0, x);                    把bin[] 里的数据 调出,按bin 的顺序放入"theChain”,完成排序。
    3. }
  10. delete [ ] bin ;
  11. }

人生第一个算法。记录一下。

猜你喜欢

转载自blog.csdn.net/shengda_mao1118/article/details/81569315