C++箱子排序

箱子排序

實現

把每一個箱子用一個鏈表實現。在進行節點分配以前,每一個箱子都是空的。數組

基本思想

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;
}
相關文章
相關標籤/搜索