归并排序的时间复杂度为:O(nlogn)
和快速排序以及堆排序相比较,归并排序的最大特点是,它是一种稳定的排序方法。
一般的情况下很少利用2路归并排序进行内部排序。
尽管递归形式的2路归并算法在形式上较为简洁,但是实用性很差
Java 实现递归形式的二路归并算法如下,参考的严蔚敏的数据结构书中所写:
import java.util.Scanner;
public class MergeSortTest {
/**
* function:将inputData数组中连个相邻子序列进行归并,两个子序列分别有序 归并inputData[s..i] inputData[i+1..t]
* @param inputData 待排序子序列
* @param tempData 临时交换空间
* @param s inputData中第一个子序列的开始位置 ,
* @param i inputData第一个字序列的结束位置
* @param t inputData第二个子序列的结束位置
*/
private static void Merge(int[]inputData,int[] tempData,int s,int i, int t){
int p,q,k;
//将inputData[s--i]与inputData[i+1--t]中的元素逐个取出按大小放到tempData数组中的对应位置
for(p=s,q=i+1,k=s;p<=i && q<=t;k++){
if(inputData[p]<=inputData[q]) tempData[k]=inputData[p++];
else tempData[k]=inputData[q++];
}
//将还未完全取出的子序列的元素放到tempData数组末尾
if(p<=i)
while(p<=i && k<=t)
tempData[k++]=inputData[p++];
if(q<=t)
while(q<=t && k<=t)
tempData[k++]=inputData[q++];
}
/**
* function: 将inputData[s..t]归并为tempData[s..t]
* @param inputData 待排序数据
* @param tempData 存放排好序的数据
* @param s inputData开始排序位置
* @param t inputData结束排序位置
*/
public static void MergeSort(int[] inputData, int []tempData, int s, int t){
if(s==t) tempData[s]=inputData[s];
else{
int mid = (s+t)/2; //将inputData[s..t]平分为inputData[s..mid] inputData[mid+1..t]
int[] temp = new int[inputData.length];
MergeSort(inputData,temp,s,mid); //递归地将inputData[s..mid]进行归并排序
MergeSort(inputData,temp,mid+1,t); //递归地将inputData[mid+1,t]进行归并排序
Merge(temp,tempData,s,mid,t); //将temp2[s..mid]和temp[mid+1..t]进行归并
}
}
private static int[] getData(){
//从控制台读入数据
Scanner sc = new Scanner(System.in);
System.out.print("请输入待排序数据总数:");
int totalNums = sc.nextInt();
int [] array = new int[totalNums];
System.out.print("请输入待排序数据,以空格作为分隔符:");
for (int i = 0; i < totalNums; i++) {
array[i]=sc.nextInt();
}
return array;
}
private static void show(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
public static void main(String[] args){
int[] inputData=MergeSortTest.getData();//读取数据
MergeSortTest.MergeSort(inputData,inputData,0,inputData.length-1);//2路归并排序
MergeSortTest.show(inputData);//显示排序好的数据
}
}