分治法实现合并排序(python)

本文介绍了一种经典的排序算法——合并排序,并详细阐述了其实现过程。首先通过递归将待排序数组拆分成较小的部分,然后对这些小部分进行排序,最后再合并起来形成完整的有序数组。该算法的时间复杂度为O(n log n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

  1. 设计一个合并排序的算法?(分治法解)
  2. 计算其时间复杂度?(要求写出递推公式,及其求解过程)
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 12 11:21:24 2022

@author: Dell
"""

def MergeSort(ary, begin, end) :
	if begin + 1 < end :     		 
		middle = (end + begin) / 2
		MergeSort(Array, begin, middle)   #归并前半个数组
		MergeSort(Array, middle, end)     #归并后半个数组
		Merge(Array, begin, middle, end)  #将两个数组合并
return -1

def Merge(ary, begin, middle, end) :
	n1 = middle - begin
	n2 = end - middle
	
	left =  [0 for i in range(n1)]
	right = [0 for i in range(n2)]
	
	for i in range(n1) :
		left[i] = ary[begin + i]    
	for i in range(n2) :
		right[i] = ary[middle + i] 
    i = 0
    j = 0
    key = 0
	for key in range(end) :
		if i < n1 and left[i] <= right[j] :
			ary[key] = left[i++]

		if j < n2 and left[i] >= right[j] :
			ary[key] = right[j++]
		
		if i == n1 and j < n2) :
			ary[key] = right[j++]
			
		if j == n2 and i < n1 :
			ary[key] = left[i++]

if __name__=='__main__':
    input_list = [3, 5, 8, 1, 4, 9, 12, 6, 7, 14]
    print('输入数组:', input_list)

	output_list = MergeSort(input_list, 0, 9)
 
	print('排序后数组:', output_list)

在这里插入图片描述

  • 第一步,将待排序的元素序列一分为二,得到两个长度基本相同的子序列;
  • 第二步,若子序列较长则继续重复以上一分为二的步骤,直至子序列的长度不大于1,对两个子序列分别排序;
  • 第三步,将排好序的子序列合并成一个有序数列,直至所有子序列全部合并,实现函数即为MergeSort函数;

递推公式:

T(n) = 2T(n/2) + O(n)
= 2(2T(n/4)) + O(n/2) + O(n) = 4T(n/4) + 2O(n)
= 8T(n/8) + 3O(n)

= 2xT(n/2x) + x O(n)
这里如果令n = 2x,则x=logn, T(n) = nT(1) + logn⁡O(n)
= n + logn⁡O(n)
= O(nlog⁡n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南木Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值