基於分配和收集
先將資料分配到不同的桶中
再將桶中的資料收集到一起
桶式排序(單關鍵字排序)
鏈式基數排序(多關鍵字排序)排序過程無須比較關鍵字,而是通過「分配」和「收集」過程來實現排序
它們的時間複雜度可達到線性階: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排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...