歸併排序和基數排序

2021-10-23 15:02:00 字數 1781 閱讀 7578

空間複雜度:o(n

)o(n)

o(n)

時間複雜度:o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

穩定性:穩定

適用於順序儲存和鏈式儲存

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兩邊的資料進...