二路并归排序
稳定排序,时间复杂度O(nlog2n) 空间复杂度O(n)
排序思想:
将两个分别排好序的集合合并到一个大的集合中,并且使得这个大的集合也是有序的。
排序算法:
(1)集合A[0~i] 集合B[0~j] 集合C[i+j]
(2)依次取出A[g]与B[g],判断两者大小,将小的放入C[h]中
(3)如果A、B有一个遍历结束需要继续遍历另一个
java实现:
稳定排序,时间复杂度O(nlog2n) 空间复杂度O(n)
排序思想:
将两个分别排好序的集合合并到一个大的集合中,并且使得这个大的集合也是有序的。
排序算法:
(1)集合A[0~i] 集合B[0~j] 集合C[i+j]
(2)依次取出A[g]与B[g],判断两者大小,将小的放入C[h]中
(3)如果A、B有一个遍历结束需要继续遍历另一个
java实现:
/**
* 合并两个集合,并且保证合并后的集合有序
* @param array
* @param low 集合A的起始位置
* @param mid mid+1 集合B的起始位置
* @param high 集合B的结束位置
*/
public static void merge(int[] array,int low,int mid,int high){
int i=low; //集合A的起点
int j=mid+1; //集合B的起点
int[] C=new int[high-low+1];
int h=0; //集合C的起点
while(i<=mid && j<=high){
if(array[i]<array[j]){
C[h]=array[i];
i++;
h++;
}else{
C[h]=array[j];
j++;
h++;
}
}
//A集合未遍历结束
while(i<=mid){
C[h]=array[i];
i++;
h++;
}
//B集合未遍历结束
while(j<=high){
C[h]=array[j];
j++;
h++;
}
//把缓存中的数据复制到数组中
for(h=0,i=low;i<=high;i++,h++){
array[i]=C[h];
}
}
/**
*
* @param array
* @param gap 集合长度
* @param arrayLen 数据总长度
*/
public static void mergePass(int[] array,int gap,int arrayLen){
int i=0;
//依次合并长度为gap的两个集合
for(i=0;i+2*gap-1<arrayLen;i=i+gap*2){
merge(array,i,i+gap-1,i+gap*2-1);
}
//不够两个gap长度的部分也需要合并
if(i+gap-1<arrayLen){
merge(array,i,i+gap-1,arrayLen-1);
}
}
/**
* mergeSort
* @param array
*/
public static void mergeSort(int[] array){
int len=array.length;
if(len<=0){
return;
}
for(int gap=1;gap<len;gap=2*gap){
//一轮一轮进行合并
mergePass(array,gap,len);
System.out.println("gap = "+gap+" ");
printAll(array);
}
}