归并排序

归并排序分析

一、代码实现

void merge(int*a,int low,int mid,int high){
    int *b = new int [high-low+1];
    int i=low,j=mid+1,k=0;
    while (i<=mid&&j<=high){
        if(a[i]<a[j]){
            b[k++] = a[i++];
        } else
            b[k++] = a[j++];

    }
    while (i<=mid)
        b[k++] = a[i++];
    while (j<=high)
        b[k++] = a[j++];
    k=0;
    for (int l = low; l <=high; ++l) {
        a[l] = b[k++];
    }
    delete []b;
}
void merge_sort(int*a,int low,int high){
    if(low==high)
        return;
    else {
        int mid = (low+high)/2;
        merge_sort(a, low, mid);
        merge_sort(a,mid+1,high);
        merge(a,low,mid,high);
    }
}

思路讲解
把一个数组分为左右两段,分别对其进行排序,则接下来只需要对两个有序数组合并即可

二、复杂度

时间复杂度:O(N*log_2N)
空间复杂度:O(N)

  • 时间复杂度:归并排序会对数组做二分分割,合并时对数组元素进行遍历,所以时间复杂度为O(N*log_2N)
  • 空间复杂度:主要来自两个方面,一个是递归分割时调用栈帧log_2N,一个是合并数组时额外开的数组N,则空间复杂度为O(N)
posted @ 2024-03-09 12:09  刘?  阅读(8)  评论(0编辑  收藏  举报