二路归并

二路归并

题目描述

编写一个程序,使用分治策略实现二路归并排序(升序)。

(图源网络,我忘了哪儿存的了。。。侵删)
这里写图片描述

img

输入

多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。

输出

输出排序之后(升序)的一维整型数组,每组输出占一行。

样例输入
6 1 8 6 5 3 4
5 12 42 2 5 8
样例输出
1 3 4 5 6 8
2 5 8 12 42
了解算法

一、将一个数组拆分为两个部分,一般取数组长度一般的位置为界,分为两个子数组,再分别对这两个子数组进行递归归并排序。

​ 二、我们确信在进行完递归排序之后,原两数组都会分别变为各自排好序的两个数组,于是接下来我们进行将这两个子数组合并为一个数组的操作;对于最上层,这是最后一步完成排序的操作.

​ 三、对于每一次分解出来的子数组,进行归并操作。

归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

归并排序的具体做法:

  1. 把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。
  2. 相邻等份合并,不断合并,直至合并完全。

二路归并

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序最常用的是二路归并,即把两个小的有序的序列和并成一个大的有序序列:合二为一。

一个二路归并的流程图是这样的:

依次比较两个数组的元素,首先是第一个数组的第一个元素和第二个数据的第一个元素比较并排序,依次类推。

img

多路归并无非是多个有序的小序列合并成一个大的有序序列,道理和二路归并一样。

算法分析:

1.算法的复杂度

img

对数组长度为n的序列进行归并排序,则大约要进行logn次归并,每一次合并都是线性时间O(n)。故粗略的计算出归并排序的时间复杂度是O(nlogn)(最好、最差都是这样)。空间复杂度是O(n)。详细的时间复杂度分析是这样的:

对长度为n的序列归并排序,需要递归的对长度为n/2的子序列进行归并排序,最后把两段子序列二路归并。递推关系是这样的:T(n)=2T(n/2)+O(n),显然T(1)=O(1),解得T(n)=o(nlogn)。

2.稳定性

归并排序是稳定的,并且是时间复杂度为o(nlogn)的几种排序[快速排序、堆排序中唯一稳定的排序算法。

3.存储结构

顺序存储和链式存储都行。

另外,归并排序多用于外排序中。

Code
package Week8;

import java.util.Scanner;
//归并排序
public class QA {
   
    public static void main(String
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值