筆記 排序演算法 合併排序(C 實現)

2021-10-05 02:23:18 字數 2300 閱讀 4502

(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...

排序演算法 合併排序

說明 之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?解法 可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再...