慕课浙大数据结构-09-排序2 Insert or Merge (25分)

参考09-排序2 Insert or Merge (25分)
思路:
这里的归并排序不能使用递归的方式了把(递归不知道该怎么写了),将每一轮循环之后的部分排序的数组与题目中的第二段数组(本代码中存储在B数组中)比较,如果相同,则使用continue和flag,再次循环一次后退出,将结果打印出来。
注意这里的归并排序虽然用非递归方式,但是仍然需要将tempA数组倒回到A中,这样可能写后面比较是否与B相同时的代码更加容易点吧。(个人观点)
错误:

  1. Rend–;多减了一次
  2. int *tempA;//wrong used 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
#include
#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;
}

你可能感兴趣的:(菜菜做题,数据结构,算法)