2014-04-14 5 views
1
#include<stdio.h> 
#include<conio.h> 
int arr[20];  
void main() 
{ 
    int n,i; 
    clrscr(); 
    printf("\n\t\t\t------Merge Sorting------\n\n"); 
    printf("Enter the size of array\n"); 
    scanf("%d",&n); 
    printf("Enter the elements:\n"); 
    for(i=0; i < n; i++) 
    { 
     scanf("%d",&arr[i]); 
    } 
    merge_sort(arr,0,n-1); 
    printf("\n\n\t\t\t-----Merge Sorted Elements-----\n\n"); 
    printf("Sorted array:\t"); 
    for(i=0; i < n; i++) 
    { 
     printf("\t%d",arr[i]); 
    } 
    getch(); 
} 

int merge_sort(int arr[],int low,int high) 
{ 
    int mid; 
    if(low < high) 
    { 
     mid=(low+high)/2; 
     merge_sort(arr,low,mid); 
     merge_sort(arr,mid+1,high); 
     merge(arr,low,mid,high); 
    } 
} 
int merge(int arr[],int l,int m,int h) 
{ 
    int arr1[10],arr2[10]; 
    int n1,n2,i,j,k; 
    n1=m-l+1; 
    n2=h-m; 
    for(i=0; i < n1; i++) 
    { 
     arr1[i]=arr[l+i]; 
    } 
    for(j=0; j < n2; j++) 
    { 
     arr2[j]=arr[m+j+1]; 
    } 
    arr1[i]=9999; 
    arr2[j]=9999; 
    i=0; 
    j=0; 
    for(k=l; k <=h; k++) 
    { 
     if(arr1[i]<=arr2[j]) 
      arr[k]=arr1[i++]; 
     else 
      arr[k]=arr2[j++]; 
    } 
} 

이 프로그램에서 main() merge_sort (arr, 0,6)에서 크기가 7.so 인 배열을 입력하는 경우 해당 조건 이후에 해당 함수로 전달됩니다. (0 < 6) then mid가 3이되면 low = 0 및 mid = 3 인 재귀 호출이 있고이 시간 mid는 (arr, 0,1)이있는 재귀 호출 1입니다. (0 < 0)가 참이 아니기 때문에 조건이 실패하면 낮은 값과 중간 값이 0이 될 때까지병합 정렬을 사용하여 언어를 재귀 사용

하지만 어떻게 merge_sort (arr, mid + 1, high)를 이해할 수 있습니까? ? 의견을 바탕으로 호출되는하지만이 프로그램은 컴파일러가 merge_sort를 호출하는 방법을 설명 호야 잘 실행 (편곡, 중간 + 1, 고)

+0

이후 merge_sort (arr, low, mid); 컴파일러는 merge_sort (int arr [], int low, int high)를 다시 호출하여 merge_sort (arr, mid + 1, high)를 다시 호출합니다. 세 번째 진술로 호출됩니다? 내가 틀렸다면 올바른 날 –

답변

4

, 진짜 질문은 :

: 재귀 코드의이 비트 제공
int merge_sort(int arr[],int low,int high) 
{ 
    int mid; 
    if(low < high) 
    { 
     mid=(low+high)/2; 
     merge_sort(arr,low,mid); 
     merge_sort(arr,mid+1,high); // THIS ONE 
     merge(arr,low,mid,high); 
    } 
} 

표시된 줄에 도달하기 전에 줄이 동일한 기능으로 재귀되기 전에 어떻게 도달 할 수 있습니까?

조건부 블록 내에서 mid의 값은 먼저 낮은 지점과 높은 지점 사이의 값으로 설정됩니다. 이 mid은 다음 반복을 위해 이되어 lowhigh을 더 가깝게 만듭니다. 결국 if(low < high)이 실패하고 해당 재귀 레그가 종료됩니다.

+0

그래서 merge_sort (arr, low, mid) 호출 후; 조건이 실패 할 경우 (arr, 0,0) with recursion stops and merge_sort (arr, mid + 1, high); 그것이 mid와 high의 경우는 int merge_sort (int arr [], int low, int high) (arr [], 0,6)의 개시 치가됩니다. –

+0

함수가 처음에'merge_sort (arr, 0, 4)'와 함께 호출된다고 가정하면 최상위 레벨 인'mid'는'2'가 될 것입니다; (merge_sort (arr, 3, 4))'merge_sort (arr, low, mid);'(merge_sort (arr, 0, 2) 고갈 될 것입니다. 재귀 수준이 낮을 때 '중간'이 변경된다는 사실은 유지되지 않습니다. 변수는 하나의 재귀 레벨에서만 국지적입니다. 디버거에서 단계별로 살펴보면 스택의 각 레벨에서 호출 스택과 변수 값에주의를 기울여보다 깊이 이해할 수 있습니다. – mah

+0

고맙습니다 .i. 그냥 디버거에서 무슨 일이 일어나는지 보려고하는 것입니다.이 재귀는 항상 저에게 불안감을줍니다. –

관련 문제