MOOC Zhejiang University Data Structure-09-Sort 2 Insert or Merge (25 баллов)

Обратитесь к 09-Sort 2 Insert or Merge (25 баллов)
Идея:
здесь сортировка слиянием не может использовать рекурсию (я не знаю, как писать рекурсию), и часть отсортированного массива после каждого раунда цикла и вопрос Сравнивается второй массив (хранящийся в массиве B в этом коде). Если они совпадают, используйте continue и flag, повторите цикл и выйдите, и распечатайте результат.
Обратите внимание, что хотя сортировка слиянием здесь использует нерекурсивный метод, все же необходимо перемотать массив tempA на A, поэтому может быть проще написать код позже, чтобы сравнить, совпадает ли он с B. (Личное мнение)
Ошибка:

  1. Rend -; уменьшено еще раз
  2. int * tempA; // неправильно использовано int tempA [MaxSize];
    tempA = (int *) malloc (n * sizeof (int));
    здесь забыли, что имя массива является константой указателя и не может быть изменено, поэтому вам нужно определить переменная-указатель, а не массив
  3. Это не ошибка. В функции merge_pass я не писал следующий код. На самом деле, мне не нужно его писать. Причина: если последний оставшийся короткий сегмент меньше длины len, просто оставьте его в массив A, потому что в противном случае функция merge1 также помещает массив tempA обратно в A, поэтому этот шаг можно пропустить (личное понимание)
      else  //最后只剩1个子列
	 	for( j = i; j < n; j++ )
	 		tempA[j] = A[j];

Общий код выглядит следующим образом

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 105
int A[MaxSize],CopyA[MaxSize],B[MaxSize];
int IsInsertFlag=0;
int IsIdentical(int A[],int n){
    
    
    int i;
    for(i=0;i<n;++i){
    
    
        if(A[i]!=B[i]) return 0; 
    }
    return 1;
     
}
void Insert_sort(int A[],int n){
    
    
    int i,j,flag=0,temp;
    for(i=1;i<n;++i){
    
    
        temp = A[i];
        for(j=i;j>0&&A[j-1]>temp;--j){
    
    
            A[j] = A[j-1];
        }
        A[j] = temp;
        if(IsIdentical(A,n)){
    
    
            printf("Insertion Sort\n");
            flag = 1;
            IsInsertFlag = 1;
            continue;
        }
        if(flag) break;
    }
}
void Merge1(int A[],int tempA[],int L,int R,int Rend){
    
    
    int Lend,temp;
    Lend = R-1;
    // len = Rend-L+1;
    temp = L;
    while(L<=Lend&&R<=Rend){
    
    
        if(A[L]<=A[R]){
    
    
            tempA[temp++] = A[L++];
        }
        else{
    
    
            tempA[temp++] = A[R++];
        }
    }
    while(L<=Lend){
    
    
        tempA[temp++] = A[L++];
    }
    while(R<=Rend){
    
    
        tempA[temp++] = A[R++];
    }
    for(;Rend>=0;Rend--){
    
    
        A[Rend] = tempA[Rend];
        // Rend--;
    }
}
void Merge_pass(int A[],int tempA[],int len,int n){
    
    
    int i,j;
    for(i=0;i+2*len<n;i+=2*len){
    
    
        Merge1(A,tempA,i,i+len,i+2*len-1);
    }
    if(i+len<n){
    
    
        Merge1(A,tempA,i,i+len,n-1);
    }
    // else  //最后只剩1个子列
	// 	for( j = i; j < n; j++ )
	// 		tempA[j] = A[j];
}
void Merge_sort(int A[],int n){
    
    
    int *tempA;//wrong used int tempA[MaxSize];
    tempA = (int*)malloc(n*sizeof(int));
    int len=1,flag = 0;
    if(tempA){
    
    
        while(len<n){
    
    
            Merge_pass(A,tempA,len,n);
            if(IsIdentical(CopyA,n)){
    
    
                printf("Merge Sort\n");
                flag = 1;
                len *= 2;
                continue;
            }
            len *= 2;
            if(flag) break;
        }
        free(tempA);
    } 
}
int main(){
    
    
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;++i){
    
    
        scanf("%d",&A[i]);
        CopyA[i] = A[i];
    }
    for(i=0;i<n;++i){
    
    
        scanf("%d",&B[i]);
    }
    Insert_sort(A,n);
    if(IsInsertFlag){
    
    
        printf("%d",A[0]);
        for(i=1;i<n;++i){
    
    
            printf(" %d",A[i]);
        }
    }
    else{
    
    
        Merge_sort(CopyA,n);
        printf("%d",CopyA[0]);
        for(i=1;i<n;++i){
    
    
            printf(" %d",CopyA[i]);
        }        
    }
    return 0;
}

рекомендация

отblog.csdn.net/weixin_43919570/article/details/105837255
рекомендация