空間複雜度:o(n
)o(n)
o(n)
時間複雜度:o(n
log2
n)
o(nlog_2n)
o(nlog
2n)
穩定性:穩定
適用於順序儲存和鏈式儲存
typedef
int elemtype;
// 合併兩個相鄰的有序線性表
void
merge
(elemtype *a,
int low,
int mid,
int high)
//*******************************************
// 合併的過程
int i=low;
// 前段陣列的指標
int j=mid+1;
// 後段陣列的指標
int k=i;
// 結果陣列的指標
while
(i<=mid && j<=high)
else
}//*******************************************
while
(i<=mid)
while
(j<=high)
//*******************************************
}void
mergesort
(elemtype *a,
int low,
int high)
}
兩個順序表的合併可參考:
基數排序借助了兩個操作,分別是「分配」和「收集」,它是一種不基於比較的排序演算法,基數排序分為最高位優先(msd)和最低位優先(lsd)
長度為n的陣列,每個關鍵字是由d元組組成,使用r個佇列實現基數排序
時間複雜度:o(d
(n+r
))
o(d(n+r))
o(d(n+
r)),一趟分配o(n
),
o(n),
o(n)
, 一趟收集o(r
)o(r)
o(r)
,時間複雜度與序列的初始狀態無關
穩定性:穩定
舉例序列:324 768 270 121 962 666 857 503 768
第一趟分配(lsd):
q0q1
q2q3
q4q5
q6q7
q8q9
270121
962503
324666
857768、768
第一趟收集:
序列1:270 121 962 503 324 666 857 768 768
第二趟分配:
q0q1
q2q3
q4q5
q6q7
q8q9
503121、324
857962、666、768、768
270第二趟收集:
序列2:503 121 324 857 926 666 768 768 270
第三趟分配:
q0q1
q2q3
q4q5
q6q7
q8q9
121270
324503
666768、768
857926
第三趟收集:
序列3:121、270、324、503、666、768、768、857、926
11 歸併排序和基數排序
核心思想 拆分和合併,拆分其實只幹了一件事將陣列2等份,一直拆分到無法拆分為止,合併在於從最小拆分單元先排序,然後向上合併再排序,最終得到乙個有序陣列。分支演算法採用的遞迴操作,核心 在於合併。public class mergesort int temp newint arr.length mer...
排序五 歸併排序和基數排序
歸併排序是另一類不同的排序方法,這種方法是運用分治法解決問題的典型範例。歸併排序的基本思想是基於合併操作,即合併兩個已經有序的序列是容易的,不論這兩個序列是順序儲存還是鏈式儲存,合併操作都可以在 m n 時間內完成 假設兩個有序表的長度分別為 m 和 n 為此,由分治法的一般設計步驟得到歸併排序的過...
排序之歸併排序和基數排序
void mergesort int arr,int copy,int left,int right left 0,right n 1 int mid left right 2 mergesort arr,copy,left,mid 不斷遞迴將其劃分成最小的部分存進copy中,再讓mid兩邊的資料進...