2.3-2重写MERGE

来源:互联网 发布:巴巴熊软件下载 编辑:程序博客网 时间:2024/05/14 02:38

MERGE 过程,使之不使用哨兵元素,而是在一旦数组 L 或 R 中的所有元素都
被复制回数组 A 后,就立即停止,再将另一个数组中余下的元素复制回数组 A 中

#include<cstdio>using namespace std;int MERGE(int *A, int p, int q, int r){    int n1 = q - p + 1;    int n2 = r - q;    int L[1000],R[1000];    //初始化数组L[]R[]为无穷大;    for(int i = 0; i <= n1+1; i++)       L[i] = 1 << 30;    for(int i = 0; i <= n2+1; i++)        R[i] = 1 << 30;    //分别向数组L[]R[]赋值;    for(int i = 1; i <= n1;i++)        L[i] = A[p + i - 1];    for(int j = 1; j <= n2;j++)        R[j] = A[q+j];    //重新定义i,j(之前在以上四个for循环中定义的i,j寿命只限于其所在的for循环中);    int i = 1;    int j = 1;    //进行归并;    for(int k = p; k <= r; k++){        if(L[i] <= R[j]){            A[k] = L[i];            i++;            continue;        }        else        {            A[k] = R[j];            j++;            continue;        }        if(i >= n1 && j < n2){            A[k] = R[j];            j++;            continue;        }        if(i < n1 && j >= n2){            A[k] = L[i];            i++;            continue;        }    }}int MERGE_SORT(int *A,int p,int r){    if(p < r)    {        int q = ((p+r)/2);        //进行递归;        MERGE_SORT(A,p,q);        MERGE_SORT(A,q+1,r);        MERGE(A,p,q,r);    }}int main(){    int A[1000];    int p,r,n;    scanf("%d",&n);    p = 1;    r = n;    printf("输入原数组:\n");    for(int i = 1;i <= n;i++)        scanf("%d",&A[i]);    MERGE_SORT(A,p,r);    printf("归并后的结果为:\n");    for(int j = 1;j <= n;j++)        printf("%d ",A[j]);    return 0;}
0 0
原创粉丝点击