二路归并
题目描述
编写一个程序,使用分治策略实现二路归并排序(升序)。
(图源网络,我忘了哪儿存的了。。。侵删)
输入
多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。
输出
输出排序之后(升序)的一维整型数组,每组输出占一行。
样例输入
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)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。
归并排序的具体做法:
- 把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。
- 相邻等份合并,不断合并,直至合并完全。
二路归并
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序最常用的是二路归并,即把两个小的有序的序列和并成一个大的有序序列:合二为一。
一个二路归并的流程图是这样的:
依次比较两个数组的元素,首先是第一个数组的第一个元素和第二个数据的第一个元素比较并排序,依次类推。
多路归并无非是多个有序的小序列合并成一个大的有序序列,道理和二路归并一样。
算法分析:
1.算法的复杂度
对数组长度为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