MOOC Zhejiang University 데이터 구조 -09-Sort 2 삽입 또는 병합 (25 점)

09-Sort 2 Insert or Merge (25 points)를 참조하십시오.
아이디어 :
여기서 병합 정렬은 재귀를 사용할 수 없습니다 (재귀를 작성하는 방법을 모르겠습니다), 루프의 각 라운드 후 정렬 된 배열의 일부와 the question 두 번째 배열 (이 코드에서 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