C++箱子排序

本文介绍了箱子排序算法,通过将元素分配到不同的链表中实现排序。文章详细阐述了该算法的基本思想,并提供了两种不同的C++实现方式,包括只使用一个箱子数组的实现和作为链表成员函数的实现,涉及到了数据结构和C++编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

箱子排序

实现

把每个箱子用一个链表实现。在进行节点分配之前,每个箱子都是空的。

基本思想

1.从与排序链表的头部开始,逐个删除节点,并把它放到合适的箱子链表的头部
2.收集并连接每个箱子中的节点,产生有序的链表

两种实现

第一种实现:

只使用一个箱子数组

//range 是分数的范围
void BinSort(Chain<Node>& X,int range)
{//按分数排序
  int len = X.Length();
  Node x;
  Chain<Node> *bin;//bin是所有的箱子
  bin = new Chain<Node> [range + 1];
  //分配到每个箱子中
  for (int i = 1;i<=len;i++)
  {
      X.Delete(1,x);
      bin[x.score].Insert(0,x);
  }
  //从箱子中收集各元素(从后向前收集)
  for (int j = range;j >= 0;j--)
  {
      while (!bin[j].Empty())
      {
          bin[j].Delete(1,x);
          X.Insert(0,x);
      }
  }
  delete [] bin;
}
第二种实现

直接写成Chain的成员函数,使用两个箱子数组,一个指向头,一个指向尾。

template <class T>
void Chain<T>::BinSort(int range)
{//按分数排序
  int b;//箱子索引号
  bottom = new ChainNode<T>* [range +1];
  top = new ChainNode<T> * [range +1];
  for (b=0;b<=range;b++)//初始化
  {
      bottom[b] = 0;
  }
  //把节点分配到各个箱子中
  for (; first;first = first.link)//添加到箱子中
  {
      b = first.data;
      if (bottom[b])//箱子非空
      {
          top[b].link = first;
          top[b] = first;
      }
      else //箱子为空
        bottom[b] = top[b] = first;
  }
  //收集各箱子中的元素
  ChainNode<T> *y =0;//暂存箱子的顶部指针
  for (b=0;b<=range;b++)
  {
      if (bottom[b])//箱子非空
      {
          if(y)//不是第一个非空的箱子
          {
              y.link = bottom[b];
          }
          else//第一个非空的箱子
              first = bottomo[b];
          y = top[b];
      }
  }
  if (y) y.link = 0;
  delete [] top;
  delete [] bottom;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值