归并排序类
归并排序
package com.MergeSort;
import java.util.Arrays;
/**
* 归并排序是另一类不同的排序方法,所谓归并,就是把两个或者两个以上的有序表合并成一个新的有序表的过程。
* 归并排序的基本思想:
* 将一个含有n个序列的有序表看成是n个长度为1的有序表,然后两两归并,得到[n/2]个长度为2的有序表,然后再两两归并,直到得到一个长度为n的有序表为止。
* 性能分析:
* 时间复杂度:
* 由于归并的趟数,等于树的高度logn,每趟归并需要移动记录n次,因此归并排序的时间复杂度为nlogn。
* 空间复杂度:
* 需要一个辅助空间,其长度等于n,所以归并排序的时间复杂度为O(n)。
* 稳定性:
* 归并排序不涉及到交换,因此是一种稳定的排序算法。
*
* 归并排序是典型的用空间去换取时间,它的时间开销比简单排序要优越,但需要与序列等长的辅助空间。
* @author tcj
*
*/
public class MergeSort {
private static int[] MergeSort(int[] a,int low,int high){
if(a == null){
return null;
}
int mid = (low + high)/2;
if(low < high){
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,mid,high);
}
return a;
}
private static void Merge(int[] a,int low,int mid,int high){
int[] temp = new int[high-low+1];
int i = low;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= high){
if(a[i] < a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
while(i <= mid){
temp[k++] = a[i++];
}
while(j <= high){
temp[k++] = a[j++];
}
for(int m = 0; m < temp.length; m++){
// a[m] = temp[m];
//上面出错了
a[m+low] = temp[m];
}
}
public static void main(String[] args){
int[] a = {2,5,1,9,8,6,3,4,0,7};
MergeSort(a,0,9);
System.out.print(Arrays.toString(a));
}
}