打赏

二路归并排序

”2路“归并,把两个已经有序的序列合并成一个。

核心操作:把数组内的两个有序序列归并成一个。

  • 空间复杂度O(n)
  • 时间复杂度O(nlog2n)
//归并排序
int *B = (int *)malloc (n * sizeof(int));    //定义足够大的数组B
void Merge(int A[], int low, int mid, int high){
    int i,j,k;
    for(k=low; k<=high; k++){    //将A复制给B
        B[k] = A[k];
    }
    for(i=low, j=mid+1, k=i; i<mid && j<=high; k++){    //将B中的元素均分,排序插入A
        if(B[i]<=B[j])
            A[k] = B[i++];
        else
            A[k] = B[j++];
    }
    //继续排序没有排序完的子序列
    while(i<=mid) A[k++] = B[i++];
    while(j<=high) A[k++] = B[j++];
}
void MergeSort(int A[], int low, int high){
    if(low<high){
        int mid = (low+high)/2;
        //对子序列排序
        MergeSort(A, low, mid);
        MergeSort(A, mid+1, high);
        //递归调用
        MergeSort(A, low, mid, high);
    }
}

 

posted @ 2022-02-03 20:00  不像话  阅读(79)  评论(0编辑  收藏  举报