归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
基本原理:通过对若干个有序结点序列的归并来实现排序。 所谓归并是指将若干个已排好序的部分合并成一个有序的部分。
package sort;
import java.util.Arrays;
/**
*
* Title: MergeSort
* Description: 将若干个已排好序的部分合并成一个有序的部分。
* @author Marmara
* @date 2018年9月23日
*/
public class MergeSort {
public static void main(String[] args) {
int a[]= {42,15,20,6,8,38,50,12};
System.out.println("原数组为:"+Arrays.toString(a));
sort(a);
System.out.println("排序后为:"+Arrays.toString(a));
}
public static void sort(int a[]) {
//判断原数组是否为空
if(a.length>0) {
//建立一个和原数组同长度的临时数组,以免频繁开辟空间
int t[]=new int[a.length];
sort(a, 0, a.length-1, t);
}
}
private static void sort(int a[],int left,int right,int t[]) {
if(left<right) {
int mid=(left+right)/2;
sort(a, left, mid, t);//左序列排序
sort(a, mid+1, right, t);//右序列排序
merge(a, left, mid, right, t);//整合排序
}
}
private static void merge(int a[],int left,int mid,int right,int[]t) {
//给左序列、右序列以及临时数组设定指针
int i=left;
int j=mid+1;
int t1=0;
while(i<=mid&&j<=right) {
if(a[i]<=a[j]) {
t[t1++]=a[i++];
}else {
t[t1++]=a[j++];
}
}
//把左、右序列的剩余元素填充到临时数组中
while(i<=mid) {
t[t1++]=a[i++];
}
while(j<=right) {
t[t1++]=a[j++];
}
t1=0;
//把临时数组中的元素存到原数组中
while(left<=right) {
a[left++]=t[t1++];
}
}
}
运行结果为: