编辑代码

#include <stdio.h>
#include <stdbool.h>



void arraymerge(int *arr1, int size1, int *arr2, int size2, int *arrout, int *sizeout)
{
    int i_start = 0;
    int j_start = 0;
    int k_start = 0;

    int i_end = size1 -1;
    int j_end = size2 -1;
    int k_end = size1+size2 -1;

    int k_end_value = 0;

    bool  flag_start = false;
    bool  flag_end = false; 

    while((i_start-1) < (i_end+1) &&  (j_start-1) < (j_end+1)){
       /* printf("arr1[%d]=%d, arr2[%d]=%d, arrout[%d]=%d,\n",
            i_start, arr1[i_start], j_start,arr2[j_start],
            k_start, arrout[k_start]);*/
        (flag_start = (arr1[i_start]<= arr2[j_start])) ? (arrout[k_start]=arr1[i_start]) : (arrout[k_start]=arr2[j_start]);
        if(flag_start){
            i_start++;
        }else{
            j_start++;
        }
        if( (k_start>=1) && (arrout[k_start] == arrout[k_start-1])){
            
        }else{
            k_start++;
        }
        /* printf("end arr1[%d]=%d, arr2[%d]=%d, arrout[%d]=%d,\n",
            i_start, arr1[i_start], j_start,arr2[j_start],
            k_start-1, arrout[k_start-1]);
         printf("end arr1[%d]=%d, arr2[%d]=%d, arrout[%d]=%d,k_end_value=%d\n",
            i_end, arr1[i_end], j_end,arr2[j_end],
            k_end, arrout[k_end],k_end_value);
*/
        (flag_end = arr1[i_end]>= arr2[j_end]) ? (arrout[k_end] = arr1[i_end]) : (arrout[k_end] = arr2[j_end]);

        if(flag_end){
            i_end--;
        }else{
            j_end--;
        }

        if((k_end_value >= 1) && (arrout[k_end] == arrout[k_end+1])){
            
            }else{
            k_end--;
            k_end_value++;
        }
         /*printf("end end arr1[%d]=%d, arr2[%d]=%d, arrout[%d]=%d,k_end_value=%d\n---------------\n",
            i_end, arr1[i_end], j_end,arr2[j_end],
            k_end+1, arrout[k_end+1],k_end_value);*/
    }
   
   // printf("i_satr%d, i_end=%d, j_start=%d, j_end=%d, k_start=%d, k_end=%d\n", i_start, i_end,
     //   j_start, j_end, k_start, k_end);
    if((i_start-1 )>= (i_end+1))
    {
        
        while(j_start <= j_end){
            arrout[k_start]=arr2[j_start];
            j_start++;
            if( (k_start>=1) && (arrout[k_start] == arrout[k_start-1])){
            
        }else{
            k_start++;
        }
        

        }
    }
    if((j_start-1) >= (j_end +1) )
    {
        while(i_start <= i_end){
            arrout[k_start]=arr1[i_start];
            i_start++;
            if( (k_start>=1) && (arrout[k_start] == arrout[k_start-1])){
            
        }else{
            k_start++;
        }
        

        }
    }
    for(int i = 0; i <k_end_value; i++ ){
        arrout[k_start] = arrout[k_end+1+i];
        if( (k_start <  1) || (arrout[k_start] != arrout[k_start-1])){
                k_start++;
        }
        
    }
    *sizeout=k_start;

    return;
}


int main () {

    int arr1[] = {1, 1, 1, 2, 3, 5,5,5 ,6,6,300,301,302} ;
    int arr2[] = {0,2, 4, 4, 4,  5, 7,7,7,7,7, 150 } ;
    //int res : [ 1, 2, 3, 4, 5, 150 ]
    //int arr1[] = {1,  2, 3, 4,5,6,7 } ;
    //int arr2[] = {1,  2, 3, 4,5,6,7 } ;
    int size1 = sizeof(arr1)/sizeof(arr1[0]);
    int size2 = sizeof(arr2)/sizeof(arr2[0]);
    int size3 = size1 + size2;
    int arrout[100]= {0};
    int sizeout = 0;
    
    printf("size1=%d, size2=%d, size3=%d \n", size1, size2, size3);

    arraymerge(arr1, size1, arr2, size2, arrout, &sizeout);
    printf("sizeout = %d \n", sizeout);
    for(int i = 0; i< sizeout; i++)
    {
        printf(" %d ", arrout[i]);
    }
    printf("\n");
    return 0;    
}