归并排序-Java

来源:互联网 发布:膜法世家绿豆面膜知乎 编辑:程序博客网 时间:2024/06/05 17:35

归并算法:就是两个有序的序列,通过归并排序,变成一个有序的队列。
这里写图片描述

如图所示,对于一个序列的排序,可以这样做:首先,将序列分解成单个的数,,然后对相邻的有序序列通过排序逐渐整合为一个大的有序序列。这就是归并排序。

下面是我写的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]+" ");        }    }}