大话算法-排序-归并排序
生活随笔
收集整理的這篇文章主要介紹了
大话算法-排序-归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序是將兩個已經排序的序列合并成一個序列的操作
1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
2、設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3、比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
4、重復步驟3直到某一指針到達序列尾
5、將另一序列剩下的所有元素直接復制到合并序列尾
?
def merge_sort(data):#不斷遞歸調用自己一直到拆分成成單個元素的時候就返回這個元素,不再拆分了if len(data) == 1:return data#取拆分的中間位置# mid = len(data) // 2mid = len(data) >> 1#拆分過后左右兩側子串left = data[:mid]right = data[mid:]#對拆分過后的左右再拆分 一直到只有一個元素為止#最后一次遞歸時候ll和lr都會接到一個元素的列表# 最后一次遞歸之前的ll和rl會接收到排好序的子序列ll = merge_sort(left)rl =merge_sort(right)# 我們對返回的兩個拆分結果進行排序后合并再返回正確順序的子列表# 這里我們調用拎一個函數幫助我們按順序合并ll和lrreturn merge(ll, rl)#這里接收兩個列表 def merge(left, right):# 從兩個有順序的列表里邊依次取數據比較后放入result# 每次我們分別拿出兩個列表中最小的數比較,把較小的放入resultresult = []while len(left) > 0 and len(right) > 0 :#為了保持穩定性,當遇到相等的時候優先把左側的數放進結果列表,因為left本來也是大數列中比較靠左的if left[0] <= right[0]:result.append(left.pop(0))else:result.append(right.pop(0))#while循環出來之后 說明其中一個數組沒有數據了,我們把另一個數組添加到結果數組后面if left:result += leftif right:result += rightreturn resultif __name__ == '__main__':li = [5, 0, 8, 4, 3, 1, 3, 6, 2, 4]li2 = merge_sort(li)print(li2)?
轉載于:https://www.cnblogs.com/imlifelong/p/10808014.html
總結
以上是生活随笔為你收集整理的大话算法-排序-归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试官:你用过哪些JDK自带的命令行工具
- 下一篇: CentOS 7.6 MySQL 8.0