归并排序是与插入排序、冒泡排序、选择排序不同的另一类排序方法。归并的含义是将两个有序表合成一个新的有序的表。
归并排序的基本思想是,将待排记录r[0]到r[n-1]看作是一个含有n个长度为一的有序子表,把这些子表依次进行两两归并,得到[n/2]个有序的子表;然后再把[n/2]个有序子表进行两两归并,一直重复,最后得到一个长度为n的有序子表为止。
算法性能分析
(1)时间复杂度:归并排序的归并趟数为[logn],而每一次归并就是将两两有序序列合并,其数据移动次数为n,及每一趟归并的时间复杂度为O(n),总共归并了n趟,所以归并排序时间复杂度为O(nlogn).
(2)空间复杂度:归并排序需要一个与待排序序列等长的辅助数组来存放排序过程的中间结果,所以空间复杂度为O(n).
(3)算法稳定性:归并排序是一种稳定的排序算法
归并排序代码:
import java.util.Scanner;
/**
* 类名:MergeSort<br>
* 功能:归并排序<br>
* 作者:java战士<br>
* 日期:2019/8/14<br>
* 版本:v1.0.0
* 历史修订:
*/
public class MergeSort {
public static void mergeSort(int[] arr){
if (arr==null||arr.length<2){
return;
}
mergeSort(arr,0,arr.length-1);
}
public static void mergeSort(int[] arr,int l,int r){
if (l==r){
return;
}
int mid=l+((r-l)>>1);
//递归思想
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,mid,l,r);
}
public static void merge(int[] arr,int mid,int l,int r){
int[] help=new int[r-l+1];
int i=0;
int p1=l;
int p2=mid+1;
while (p1<=mid && p2<=r){
//核心点,p1和p2分别为数组的牵绊部分和后半部分的元素,游标那个元素小,就先放到辅助数组中,然后继续比较,以此类推
help[i++]=arr[p2]>arr[p1]?arr[p1++]:arr[p2++];
}
while (p1<=mid){
help[i++]=arr[p1++];
}
while (p2<=r){
help[i++]=arr[p2++];
}
for (i=0;i<help.length;i++){
arr[l+i]=help[i];
}
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
String str=scanner.next().toString();
String[] arr=str.split(",");
int[] arr1=new int[arr.length];
for (int i=0;i<arr.length;i++){
arr1[i]=Integer.parseInt(arr[i]);
}
mergeSort(arr1);
for (int i=0;i<arr1.length;i++){
System.out.print(arr1[i]+" ");
}
}
}
测试结果: