所謂鏈式基數排序,就是實現基數排序時,為減少所需的輔助儲存空間,應採用鍊錶作儲存結構,即鏈式基數排序。而基數排序也叫做多關鍵字排序,基數排序是一種借助「多關鍵字排序」的思想來實現「單關鍵字排序」的內部排序演算法。
鏈式的基數排序演算法解法思路(預設從小到大):
1、以靜態鍊錶儲存待排記錄,並令表頭指標指向第乙個記錄;
2、「分配」 時,按當前「關鍵字位」所取值,將記錄分配到不同的 「鏈佇列」 中,每個佇列中記錄的 「關鍵字位」 相同;
3、「收集」時,按當前關鍵字位取值從小到大將各佇列首尾相鏈成乙個鍊錶;
4、對每個關鍵字位均重複 2 和 3 兩步。
例:鏈式基數排序,下面以靜態鍊錶儲存待排記錄,並令表頭指標指向第乙個記錄。
「分配」 時,按當前「關鍵字位」所取值,將記錄分配到不同的「鏈佇列」中,每個佇列中記錄的 「關鍵字位」 相同。 因為是 lsd,故從地位開始 ,也就是kd-1位開始,進行一趟分配:
這裡的e[i]表示按哪個位進行排序變成f[i]。分別為這個佇列的隊頭和隊尾,先入先出的「鏈佇列」或者是乙個個的「桶」。
然後xx9,xx3,xx0
又遇到了 xx9,那麼按照鏈式佇列的儲存方式,先進先出的入隊(類似乙個桶,資料從上面進入,從下面露出)
第一趟收集:按當前關鍵字位取值從小到大將各佇列首尾相鏈成乙個鍊錶;(從佇列的下面出去,先進先出)
進行第二趟分配:
進行第二題收集
進行第三趟分配:
進行第三趟收集
這樣的話序列按照多關鍵字從小到大的排序有序了。
具體**如下:
#include#includeusing namespace std;
//鏈式佇列的節點結構,模擬桶
struct node
;//定義程式所需的特殊佇列
class queue
//析構函式,銷毀鏈隊的結點佔據的記憶體
~queue() }
//入隊方法,從尾進入,節點不存在,需要自行建立結點的方法
void push(int e)
//入隊方法,尾進入,節點原來就存在的方法,不需要再新建結點和儲存結點的內容
void push(node *p)
//求資料元素的最大位數的方法,也就是求出需要分配和收集的次數
int lengthdata()
//沿著鏈隊後移乙個元素
p = p->next;
//找出資料元素的最大位數
if (length < n)
//重新迴圈往復,n 設定為0
n = 0;
} //返回最終位數
return length;
} //判斷佇列是否為空
bool empty()
//否則為不空
return false;
} //清除佇列中的元素
void clear()
//輸出佇列中的元素,傳入引用引數比較好
void print(queue &que) }
//基數排序過程
void radixsort(queue& que)
//取得待排序資料元素中的最大位數
int maxlen = que.lengthdata();
//因為是 lsd 方式,從後到前,開始比較關鍵字,然後分配再收集,故開始設定資料分離演算法中的除數為 1
int d = 1;
//將初始佇列中的元素分配到十個佇列中,maxlen 代表了需要分配和收集的次數
for (int i = 0; i < maxlen; i++)
//清空原始佇列
que.clear();
//分配完畢,馬上將十個佇列中的資料收集到原始佇列中
for (int i = 0; i < 10; i++)}}
//一趟的分配收集完畢,最後要清空十個佇列
for (int i = 0; i < 10; i++)
//進行下一趟的分配和收集
d *= 10;
} //輸出佇列中排好序的元素
print(que);
}};int main(void)
//基數排序
oldque.radixsort(oldque);
return 0;
}
程式執行結果: 鏈式基數排序
c1.h 程式名 include include include malloc 等 include int max等 include eof z或f6 null include atoi include eof include floor ceil abs include exit 函式結果狀態 d...
鏈式基數排序
將乙個關鍵字,如278,分為三個關鍵字 2 7 8 把待排元素按某一位從低到高新增到相應的f e中,其實f和e只是指向頭尾兩個元素,鍊錶的連線關係實際上是通過修改r的next指標實現的。created by dgm on 19 4 23.include define maxnum 10000 def...
排序演算法 基數排序詳解
筆者今天學習字尾陣列,發現需要用到基數排序,所以趕緊學習一波。基數排序是基於關鍵字排序,先比較第乙個關鍵字,再比較第二個關鍵字。舉個栗子 假如我們有一堆數,17,8,25,78,123,512,250 實際操作時,是將依次將個位 十位 百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素...