国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python編程實現歸并排序

2020-02-23 04:34:06
字體:
來源:轉載
供稿:網友

因為上個星期leetcode的一道題(Median of Two Sorted Arrays)所以想仔細了解一下歸并排序的實現。

還是先闡述一下排序思路:

首先歸并排序使用了二分法,歸根到底的思想還是分而治之。拿到一個長數組,將其不停的分為左邊和右邊兩份,然后以此遞歸分下去。然后再將她們按照兩個有序數組的樣子合并起來。這樣說起來可能很難理解,于是給出一張我畫的圖。

這里顯示了歸并排序的第一步,將數組按照middle進行遞歸拆分,最后分到最細之后再將其使用對兩個有序數組進行排序的方法對其進行排序。

兩個有序數組排序的方法則非常簡單,同時對兩個數組的第一個位置進行比大小,將小的放入一個空數組,然后被放入空數組的那個位置的指針往后 移一個,然后繼續和另外一個數組的上一個位置進行比較,以此類推。到最后任何一個數組先出棧完,就將另外i一個數組里的所有元素追加到新數組后面。

由于遞歸拆分的時間復雜度是logN 然而,進行兩個有序數組排序的方法復雜度是N該算法的時間復雜度是N*logN 所以是NlogN。

根據這波分析,我們可以看看對上圖的一個行為。

當最左邊的分到最細之后無法再劃分左右然后開始進行合并。

第一次組合完成[4, 7]的合并

第二次組合完成[4, 7, 8]的合并

第三次組合完成[3, 5]的合并

第四次組合完成[3, 5, 9]的合并

第五次組合完成[3, 4, 5, 7, 8, 9]的合并結束排序。

下面放上python的代碼

def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b):  if a[j] < b[h]:   c.append(a[j])   j += 1  else:   c.append(b[h])   h += 1 if j == len(a):  for i in b[h:]:   c.append(i) else:  for i in a[j:]:   c.append(i) return cdef merge_sort(lists): if len(lists) <= 1:  return lists middle = len(lists)/2 left = merge_sort(lists[:middle]) right = merge_sort(lists[middle:]) return merge(left, right)if __name__ == '__main__': a = [4, 7, 8, 3, 5, 9] print merge_sort(a)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋江市| 尉犁县| 郯城县| 凤城市| 阿克苏市| 航空| 武定县| 固安县| 浦县| 玉屏| 河东区| 塔河县| 汤阴县| 泰兴市| 宁国市| 双桥区| 三穗县| 杭锦后旗| 中卫市| 孝感市| 滦平县| 嘉黎县| 定南县| 台中县| 休宁县| 施秉县| 巴彦淖尔市| 宜良县| 威宁| 天全县| 酒泉市| 隆德县| 锡林郭勒盟| 六枝特区| 正阳县| 商都县| 博白县| 玛多县| 调兵山市| 唐河县| 汉寿县|