思想
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
步骤
归并排序工作原理:(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕
归并操作
两个已经排序的数组,合并成一个排序的数组
/**
* 两个有序数组进行归并
* A数组的两个部分low - mid,mid+1-high进行归并,这两部分都是有序的
* @param A
* @param low
* @param mid
* @param high
*/
public void merge(int[] A,int low ,int mid ,int high){
int len = high - low + 1;
int[] C = new int[len]; // 临时存放中间归并数组
int i=low;
int j=mid+1;
int k=0;
while(i<=mid || j<=high){
if(i<=mid && j<=high){
if(A[i]<A[j]){
C[k]=A[i];
k++;
i++;
}else{
C[k]=A[j];
k++;
j++;
}
}else if(i<=mid){
C[k] = A[i];
k++;
i++;
}else if(j<=high){
C[k] = A[j];
k++;
j++;
}
}
for(k=0;k<len;k++){
A[k+low] = C[k];
}
}
排序操作
public void mergeSort(int[] A,int low,int high){
if(low>=high)// 停止归并
return;
int mid = low + (high - low)/2;
mergeSort(A,low,mid);
mergeSort(A,mid+1,high);
merge(A,low,mid,high);
}
复杂度分析
(1)时间复杂度
时间复杂度与初始序列无关
归并操作的时间复杂度是
O(n)
,排序时间复杂度:
O(nlog2(n))
(2)空间复杂度
O(n)
主函数
public static void main(String[] args){
int[] A = new int[]{49,38,65,97,76,13,27,49};
Print.printArray(A);
MergeSort MergeSort = new MergeSort();
MergeSort.mergeSort(A,0,A.length-1);
Print.printArray(A);
}
输出
49 38 65 97 76 13 27 49
13 27 38 49 49 65 76 97