資料結構 分配排序

2021-10-01 15:00:16 字數 2039 閱讀 6820

基於分配和收集

先將資料分配到不同的桶中

再將桶中的資料收集到一起

桶式排序(單關鍵字排序)

鏈式基數排序(多關鍵字排序)排序過程無須比較關鍵字,而是通過「分配」和「收集」過程來實現排序

它們的時間複雜度可達到線性階:o(n)。

假設待排序的記錄的值在0~m-1之間

設定m個桶,

依次掃瞄待排序的記錄,r[1],…,r[n-1],把關鍵字等於k的記錄全都裝入到第k個箱子裡(分配),

然後按序號依次將各非空的箱子首尾連線起來(收集)。

#include

#include

#include

using

namespace std;

intmain()

for(i=

0;i<=

1000

;i++

)//輸出排序結果

if(b[i]

>0)

cout<" "<

cout

}

struct node
struct head

;

void

distribute

(node *first,

int n, head *list)

}

void

collect

( head *list, node *

&first,

int m)

}

int

main()

int n;

cin>>n;

first=

null

;for

( i=

0;i)distribute

(first,n,list)

;collect

(list,first,m)

; node *p=first;

while

(p) cout

}

需要較多的桶

一次分配,o(n)

一次收集,o(m)

o(n+m)

o(m)

穩定從關鍵字的最「低位」開始,將關鍵字分配到r(基數)個堆(桶)中;

按桶的編號將關鍵字收集起來;

然後,以「次低位」將關鍵字又分配到r個桶中;再收集,……,重複直到「最高位」為止,這時,以按關鍵字有序。

void

distribute

(node *first,

int n, head *list,

int d)

else

list[data]

.first=list[data]

.rear=p;

list[data]

.rear-

>next=

null

; p=q;

}

void

collect

( head *list, node *

&first,

int m)

}

main函式

...

...int d;

cout<<

"please input the size of a data:"

; cin>>d;

for(i=

1;i<=d;i++

)//處理每一「位」(個位、十位...)

}

多次分配,多次收集

一次分配的時間複雜性o(n)

一次收集的時間複雜性o(radix)

分配與收集的次數:數的位數(d)

o(d(n+radix))

o(radix)

穩定

資料結構 演算法 分配排序

分配排序的基本思想 排序過程無須比較關鍵字,而是通過 分配 和 收集 過程來實現排序.它們的時間複雜度可達到線性階 o n 1 箱排序的基本思想 箱排序也稱桶排序 bucket sort 其基本思想是 設定若干個箱子,依次掃瞄待排序的記錄r 0 r 1 r n 1 把關鍵字等於k的記錄全都裝入到第k...

資料結構 排序

小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 o n2 o n2 o n 穩定o 1 希爾排序 o n3 2 增量序列最後為1,只有公因子1 不穩o 1 選擇簡單選擇 o n2 o n2 o n 穩定o 1 堆排序o n lb n o n lb...

資料結構 排序

郝斌版 資料結構 學習筆記 冒泡 公升序,12比,大放後面,再23比,直至最大的在最後面 插入 2,3,4,依次插入值,保證插入值後的序列為有序的 選擇 後面所有的最小值依次排到最前 快速排序 歸併排序 22排,44排,88排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...