(nl
gn)\theta(nlg n)
θ(nlgn
)空間複雜度:t(n
)t(n)
t(n)
舉個例子:給陣列a
=a = \
a=排序
合併排序流程
merge sort a
(1) if n=1, done
(2)對a和 a
a[i+1]
= key;
}//return a;
}/**
定義merge_sort函式實現合併排序
input:
a:int,是需要排序的陣列. 指標傳遞,函式內部對a的修改能導致外部a的變化
length: int,是待排序陣列的長度.
output:
a: int*, 排序後的陣列.
**/void
merge_sort
(int a,
int length)
l[n1]
= infty;
for(
int j=
0; j
) r[n2]
= infty;
// 這裡沒有一直使用歸併排序,而是選擇當陣列長度足夠小時,採用其他排序來代替,這裡我選用的是之前實現的插入排序。這樣做的好處是可以縮短排序時間,因為在陣列長度足夠小時,使用其他排序的時間可能更快,我記得課本上的陣列長度大概是20左右開始使用其他排序的,這裡,為了測試方便,我到5就開始用了。。。
if(n1 <5)
insert_sort
(l, n1)
;else
merge_sort
(l, n1);if
(n2 <5)
else
// 開始歸併
i =0;
int p =
0, q =0;
while
( ielse
i++;}
delete
l;delete
r;//return a;
}測試
int
main()
;int i;
cout<<
"a[i]的值為: "
;for
(i=0
; i<
15; i++
) cout<
int length =
sizeof
(a)/
sizeof
(a[0])
;//sizeof()函式可以返回陣列所佔的記憶體,而sizeof(a[0])返回的是陣列第乙個元素所佔的記憶體。
merge_sort
(a, length)
; cout<<
"排序後a[i]的值為: "
;for
(i=0
; i<
15; i++
) cout<
return0;
}/**
測試結果:
a[i]的值為: 3, 19, 13, 5, 6, 28, 33, 38, 43, 12, 53, 58, 63, 2, 73,
排序後a[i]的值為: 2, 3, 5, 6, 12, 13, 19, 28, 33, 38, 43, 53, 58, 63, 73,
**/去看了一下leecode,發現現在這樣寫的問題,由於使用陣列l和r,造成額外的空間消耗,應該是有這樣的問題…然後,**就不改了,順便把在leecode寫的**放上來,不想看的可以直接錯過了,想看的可以幫我看看**錯了,好像是越界了?
class
solution
a[i+1]
= key;
}return a;
} vector<
int>
sortarray
(vector<
int>
&nums)
else
// 開始歸併
int i =0;
int p =
0, q =0;
while
( ielse
i++;}
return nums;}}
;參考文獻
由於只進行了一次測試,可能有寫我沒發現的bug,
如有不足之處,還望指出。
合併排序 C 實現
寫給自己的,避免忘記!合併排序演算法採用先分治,再合併的思路。此思路根據演算法導論原理,在合併演算法中,是將兩個已經排序好的陣列進行合併。我的演算法是可以對任意可變陣列進行排序,對於待合併的陣列元素為n,最多比較n次,為實現高效率,避免每次檢查陣列,檢查到最後導致溢位,在每乙個陣列後面加乙個哨兵,哨...
排序演算法 合併排序
這個排序比起冒泡,選擇什麼的就快很多了,時間複雜度是n logn,但是實現起來也很複雜。原理是 第一步,合併1 2 3 4 5 6.相鄰兩個排序 第二步,合併1 2 3 4 5 6 7 8 9.相鄰四個排序 實現起來最主要的是合併的函式,廢話不多說,看 class mergersorter priv...
排序演算法 合併排序
說明 之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?解法 可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再...