个人资料
合并排序(Merge Sort )是一种非常高效的排序方法,运用了分割统治的思路。 基本的排序思路是先将整个序列分成两部分,然后对各组中的两个元素排序。 接下来是组与组的合并。 只需遍历两个组中的所有元素一次,即可按顺序合并。 因此,最终所有组合都成为一对时,整个数列都会进行排序。
算法的实现步骤
将长度为n的输入序列分为长度为n/2的两个子序列;
对这两个子序列分别进行递归排序;
提取已排序的两个子序列的元素,并按顺序组合为一个最终序列,从而完成排序。
Python代码的实现
# merge_sort代码的实现
来自类型导入列表
defmerge(ARR1:list[int],arr2:List[int] ) :
result=[]
while arr1 and arr2:
if arr1[0] arr2[0]:
result.append(arr1.pop(0) ) ) ) ) ) ) )。
else:
result.append(ARR2.pop(0) ) ) ) ) ) ) ) )。
if arr1:
result =arr1
if arr2:
result =arr2
返回结果
def merge _ sort (arr : list [ int ] ) :
''''
合并排序
:param arr:要排序的列表
:return:系列列表
''''
iflen(arr )=1:
返回arr
mid=len(arr )/2
返回合并(merge_sort ) arr[:mid],合并_ sort ) arr[mid:] )
#测试数据
if __name__=='__main__':
导入随机
Random.seed(54岁)。
arr=[ random.randint (0,100 ) for_inrange ) 10]
print ('原始数据:',arr )
arr_new=merge_sort(arr )
print ()合并排序结果: ",arr_new "
#输出结果
原始数据: [ 17,56,71,38,61,62,48,28,57,42 ]
合并结果: [17、28、38、42、48、56、57、61、62、71]
动画演示
算法分析
时间的复杂性
合并时间复杂度公式:排序总时间=子序列的排序时间合并时间。
如果序列中有$n$个的排序时间为$tleft(nright ) $
$$
tleft(nright )=2tleft d frac { n } {2}right )text{合并时间}
$$
合并时,两个子序列已经在组中排序,因此当将两个排序序列组合成一个较大的排序序列时,时间复杂度为$n$,如下所示
$$
tleft(n ) right )=2tleft ) dFrac{n}{2} ) right ) n
$$
通过递归推导,可以发现:
$$
tleft(n ) right )=2^mt ) left ) dFrac{n}{2^m}right ) mn
$$
$d如果frac { n } {2^ m }=1$,则递归退出。 在这种情况下,可以:
$$
tleft(1) right )=0,tleft(1 ) right )=nlog _2n
$$
因此,合并排序的时间复杂度为$o(nlog_2n ) $
空间复杂性
每次递归都需要辅助表,长度与要排序的表相同。 递归次数为$o(log_2n ) $,但每次递归都会释放二次空间,下次递归的堆栈空间和二次空间与此部分释放的空间无关。 因此,空间的复杂性为$o(n ) $。
稳定性
在合并排序过程中,确保相等元素的相对位置保持不变,因此排序是稳定的。
综合评价
时间复杂性(平均)
时间复杂性(最高) )
时间的复杂性(最差)
空间复杂性
排序方法
稳定性
$o(nlog_2n ) $
$o(nlog_2n ) $
$o(nlog_2n ) $
$o(n ) $
出局-游戏
稳定
联系你