大话算法-排序-归并排序
生活随笔
收集整理的這篇文章主要介紹了
大话算法-排序-归并排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
歸并排序是將兩個(gè)已經(jīng)排序的序列合并成一個(gè)序列的操作
1、申請空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來存放合并后的序列
2、設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置
3、比較兩個(gè)指針?biāo)赶虻脑?#xff0c;選擇相對小的元素放入到合并空間,并移動(dòng)指針到下一位置
4、重復(fù)步驟3直到某一指針到達(dá)序列尾
5、將另一序列剩下的所有元素直接復(fù)制到合并序列尾
?
def merge_sort(data):#不斷遞歸調(diào)用自己一直到拆分成成單個(gè)元素的時(shí)候就返回這個(gè)元素,不再拆分了if len(data) == 1:return data#取拆分的中間位置# mid = len(data) // 2mid = len(data) >> 1#拆分過后左右兩側(cè)子串left = data[:mid]right = data[mid:]#對拆分過后的左右再拆分 一直到只有一個(gè)元素為止#最后一次遞歸時(shí)候ll和lr都會(huì)接到一個(gè)元素的列表# 最后一次遞歸之前的ll和rl會(huì)接收到排好序的子序列ll = merge_sort(left)rl =merge_sort(right)# 我們對返回的兩個(gè)拆分結(jié)果進(jìn)行排序后合并再返回正確順序的子列表# 這里我們調(diào)用拎一個(gè)函數(shù)幫助我們按順序合并ll和lrreturn merge(ll, rl)#這里接收兩個(gè)列表 def merge(left, right):# 從兩個(gè)有順序的列表里邊依次取數(shù)據(jù)比較后放入result# 每次我們分別拿出兩個(gè)列表中最小的數(shù)比較,把較小的放入resultresult = []while len(left) > 0 and len(right) > 0 :#為了保持穩(wěn)定性,當(dāng)遇到相等的時(shí)候優(yōu)先把左側(cè)的數(shù)放進(jìn)結(jié)果列表,因?yàn)閘eft本來也是大數(shù)列中比較靠左的if left[0] <= right[0]:result.append(left.pop(0))else:result.append(right.pop(0))#while循環(huán)出來之后 說明其中一個(gè)數(shù)組沒有數(shù)據(jù)了,我們把另一個(gè)數(shù)組添加到結(jié)果數(shù)組后面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)?
轉(zhuǎn)載于:https://www.cnblogs.com/imlifelong/p/10808014.html
總結(jié)
以上是生活随笔為你收集整理的大话算法-排序-归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试官:你用过哪些JDK自带的命令行工具
- 下一篇: 编写代码的「八荣八耻」- 以用户易用为荣