09-Sort 2 Insert or Merge (25 points)를 참조하십시오.
아이디어 :
여기서 병합 정렬은 재귀를 사용할 수 없습니다 (재귀를 작성하는 방법을 모르겠습니다), 루프의 각 라운드 후 정렬 된 배열의 일부와 the question 두 번째 배열 (이 코드에서 B 배열에 저장 됨)을 비교하여 동일한 경우 continue 및 flag를 사용하고 다시 반복하고 종료하고 결과를 인쇄합니다.
여기서 병합 정렬은 비재 귀적 방법을 사용하지만 tempA 배열을 A로 되 감아 야하므로 나중에 코드를 작성하여 B와 동일한 지 비교하는 것이 더 쉬울 수 있습니다. (개인 의견)
오류 :
- Rend--; 한 번 더 줄였습니다.
- int * tempA; // 잘못 사용됨 int tempA [MaxSize];
tempA = (int *) malloc (n * sizeof (int));
여기서는 배열 이름이 포인터 상수이고 변경할 수 없음을 잊었으므로 정의해야합니다. 포인터 변수이고 배열이 아님 - 이것은 오류가 아닙니다. 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;
}