归并排序——建立在归并操作上的一种有效的排序算法。
原理
假设初始待排序数据有n个,可以将n个数据看成n个独立的子序列,因此每个子序列的长度为1,然后两两合并,得到[n/2]个长度为2或1(注意如果n为奇数时,就会出现多出一个元素无法与其他元素合并)的有序子序列;再两两合并,一种重复下去,直到得到一个长度为n的有序序列为止,这种排序方法为二路归并排序方法。
思想
分治法,核心步骤为:
- 分解
- 合并
工作原理
- 1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 4、重复步骤3直到某一指针达到序列尾
- 5、将另一序列剩下的所有元素直接复制到合并序列尾
性能分析
时间复杂度:
空间复杂度:
稳定性:稳定
python代码
class Solution:
def merge_sort(self,nums:list,left:int,right:int):
if left < right:
mid = (left + right)//2
self.merge_sort(nums,left,mid)
self.merge_sort(nums,mid+1,right)
self.merge(nums,left,mid,right)
def merge(self,nums:list,left:int,mid:int,right:int):
i = left
j = mid+1
tmp = []
while i <= mid and j <= right:
if nums[i] <= nums[j]:
tmp.append(nums[i])
i = i + 1
else:
tmp.append(nums[j])
j = j + 1
while i <= mid:
tmp.append(nums[i])
i = i + 1
while j <= right:
tmp.append(nums[j])
j = j + 1
nums[left:right+1]=tmp
s = Solution()
nums=[1,3,5,7,9,2,4,6,8,10]
s.merge_sort(nums,0,9)
print(nums)