排序演算法之鏈式基數排序(詳解)內附大佬連線

2021-09-22 02:07:29 字數 2552 閱讀 7364

所謂鏈式基數排序,就是實現基數排序時,為減少所需的輔助儲存空間,應採用鍊錶作儲存結構,即鏈式基數排序。而基數排序也叫做多關鍵字排序,基數排序是一種借助「多關鍵字排序」的思想來實現「單關鍵字排序」的內部排序演算法。

鏈式的基數排序演算法解法思路(預設從小到大):

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 實際操作時,是將依次將個位 十位 百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素...