日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法-归并排序

發(fā)布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法-归并排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歸并排序是建立在歸并操作上的一種有效的排序算法。

該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。歸并排序是一種穩(wěn)定的排序方法。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表 合并成一個有序表,稱為2-路歸并

歸并排序的思路

給定待排序的數(shù)組 data_list,長度為 n ,設(shè)置首尾兩個游標(biāo) p,q,初始狀態(tài),p = 0,q = n, 先不糾結(jié)是 n 還是 n-1 。

分解: 取中間值 r = (p + q)/2 ,將數(shù)組分成左部分 data_list[p,r],右部分 data_list[r+1,q] 。

對上述左右部分遞歸調(diào)用分解。 歸并左部分和右部分的結(jié)果。 退出條件是 p>=q。

def merge_sort(data_list):length = len(data_list)merge_sort_c(data_list, 0, length)def merge_sort_c(data_list, p, q):if p + 1 >= q:returnelse:r = (p + q)//2merge_sort_c(data_list, p, r)merge_sort_c(data_list, r, q)merge(data_list, p, r, q)def merge(data_list, p, r, q):tmp = []i = pj = rwhile i < r and j < q:if data_list[i] <= data_list[j]:tmp.append(data_list[i])i += 1else:tmp.append(data_list[i])j += 1while i < r:tmp.append(data_list[i])i += 1while j < q:tmp.append(data_list[j])j += 1for temp_index, index in enumerate(range(p, q)):data_list[index] = tmp[temp_index]unsort = [1,3,4,2,1,5,6,7,8,4] print(merge_sort(unsort)) print(unsort)

?

性能分析

1、時間復(fù)雜度:歸并排序不關(guān)心數(shù)組的初始狀態(tài),因此最好、最壞、平時時間復(fù)雜度都是一樣的,為O(nlogn)

2、空間復(fù)雜度:O(n),因此它不是一個原地排序算法。遞歸代碼的空間復(fù)雜度并不能像時間復(fù)雜度那樣累加。盡管每次合并操作都需要申請額外的內(nèi)存空間,但在合并完成之后,臨時開 辟的內(nèi)存空間就被釋放掉了。在任意時刻,CPU 只會有一個函數(shù)在執(zhí)行,也就只會有一個臨 時的內(nèi)存空間在使用。臨時內(nèi)存空間最大也不會超過 n 個數(shù)據(jù)的大小,所以空間復(fù)雜度是 O(n)。

3、穩(wěn)定性:穩(wěn)定。我們對數(shù)組分成左右兩部分,對于兩邊相同的值,我們可以選擇將右部分 的值歸并后放在左邊相同值的后面,因此它是穩(wěn)定的排序算法。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的排序算法-归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。