把每一個箱子用一個鏈表實現。在進行節點分配以前,每一個箱子都是空的。數組
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; }