归并排序

来源:互联网 发布:windows 7默认壁纸 编辑:程序博客网 时间:2024/06/06 10:59

思想

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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
0 0
原创粉丝点击