排序算法之归并排序

来源:互联网 发布:mysql 修改字段长度 编辑:程序博客网 时间:2024/06/14 12:15

思想:

    1. 基于分治法    2. 将待排序序列每次进行两两划分    3. 将划分好的序列进行两两合并,并且在合并的过程中进行排序r

性能

    1. 时间复杂度:            * merge函数中递归是一个完全二叉树:log2n            * 里面还有一个合并的while循环n            * 时间复杂度 = O(nlogn)    2. 空间复杂度            * 与原始记录序列同样数量的存储空间存放归并结果            * 递归时深度为logcn的栈空间            * 空间复杂度:O(n+logn)    3. 稳定性:             * 需要两两比较,不存在跳跃            * 稳定

代码

void mergeSort(int a[],int l,int r,int m){    int L1 = m-l+1;//要合并的第一个子数组的长度    int R1 = r-m;//要合并的第二个子数组的长度    int L[L1];//要合并的第一个子数组    int R[R1];//要合并的第二个子数组    //将分成的两部分分别放入L和R中    for (int i = 0; i<L1; i++) {        L[i] = a[l+i];//因为合并的两个数组的左边的数组不一定从0开始,所以一定要加上l    }    for (int j = 0; j<R1; j++) {        R[j] = a[m+j+1];    }    //合并两个数据    int k = l;//k一定要等于l,因为左半边不一定是从0开始的    int i = 0;    int j = 0;    while (i<L1 &&j<R1) {        if (L[i]<R[j]) {            a[k++] = L[i++];        }        else{            a[k++] = R[j++];        }    }    //因为两个数组长度可能不一样,如果那个没有遍历完,就把它放入到合并好的数组的后面    while (i<L1) {        a[k++] = L[i++];    }    while (j<R1) {        a[k++] = R[j++];    }}//归并排序void merge(int a[],int l,int r){    if (l<r) {        //先将待排序数组进行划分,每次划分为2部分        int m = (l+r)/2;        merge(a, l, m);        merge(a, m+1, r);        //对划分好的子数组两两合并排序        mergeSort(a, l, r, m);    }}
原创粉丝点击