归并排序-Java
归并算法:就是两个有序的序列,通过归并排序,变成一个有序的队列。
如图所示,对于一个序列的排序,可以这样做:首先,将序列分解成单个的数,,然后对相邻的有序序列通过排序逐渐整合为一个大的有序序列。这就是归并排序。
下面是我写的java代码:
public class GuiBingPaiXu {
//此方法通过递归将数组分成单个的数字
public static void mergeSort(int[] array, int low, int high) {
if(low == high) {
return;
}
int mid = (low + high)>>1;
mergeSort(array, low, mid);
mergeSort(array, mid+1, high);
//调用归并方法,开始两两排序归并
merge(array, low, mid, high);
}
//此方法用来将单个元素两两归并排序处理
public static void merge(int[] array, int low, int mid, int high) {
//用来存放排序好的数,这也是为什么归并排序的空间复杂度是O(n)的原因;
int[] orderedArray = new int[high-low+1];
int i = low;
int j = mid+1;
int k=0;
while(i<=mid && j<=high) {
if(array[i] <= array[j]) {
orderedArray[k++] = array[i++];
} else {
orderedArray[k++] = array[j++];
}
}
//如果高位数组还有值,遍历放到orderedArray数组中
while(j<=high) {
orderedArray[k++] = array[j++];
}
//如果低位数组还有值,遍历放到orderedArray数组中
while(i<=mid) {
orderedArray[k++] = array[i++];
}
//最后将有序数组重新写回到对应的原数组的相应位置
k=0;
for(int index=low; index<=high; index++) {
array[index] = orderedArray[k++];
}
}
public static void main(String[] args) {
int[] a = {1,12,34,54,23,32,12,65,23,11,4,2};
mergeSort(a, 0, a.length-1);
for(int i=0; i<a.length; i++) {
System.out.print(a[i]+" ");
}
}
}