2017-02-14 14 views
0

저는 재귀 부분에서 'ANSI-C 프로그래밍 언어'를 읽고 있습니다. '크기'변수는 정렬 기능을 내부에 작업이 '권리'인수를 변경할 수 없다에도 불구하고 불렀다 분류 기능 후에 변경 한 이유빠른 정렬 함수가 인수의 값을 변경하는 이유

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 

static int v[] = {1,3,6,1,2,3,6,89,3,5,7,2,3}; 
int size = sizeof(v)/sizeof(v[0]); 

void sy_swap (int v[], int i, int j); 
void sy_qsort(int v[], int left, int right); 

/*Swap function*/ 
void sy_swap (int v[], int i, int j) 
{ 
    int temp; 
    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

/*Sort function*/ 
void sy_qsort(int v[], int left, int right) 
{ 
    int i, last; 
    static int loop = 0; 

    if(left >= right){ /*Finish sort*/ 
     return; 
    } 
    sy_swap(v, left, (left + right)/2); /*Move middle element to beginning of the half*/ 
    last = left; 
    for(i = left+1; i<=right; i++){ /*After this loop, we have to half: smaller than 'middle element' and bigger*/ 
     if (v[i] < v[left]){ 
      sy_swap(v, ++last, i); 
     } 
    } 
    sy_swap(v, left, last); /*Move 'middle element' to the head of SMALL half, to finish division the array into 2 half*/ 

    sy_qsort(v,left, last-1); /*Sort Small Half*/ 
    sy_qsort(v, last+1, right); /*Sort Big Half*/ 

} 

int main(void) 
{ 
    int i = 0; 

    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' before sort*/ 
    sy_qsort(v,0,size); 
    printf("sizes: size of v=%d, size of v[0]=%d, total elements=%d\n",(int)sizeof(v), (int)sizeof(v[0]),size); /*Check 'size' after sort*/ 

    for (i =0; i<size; i++){ 
     printf("%d,",v[i]); 
    } 

    return (0); 
} 

사람이 알고 계십니까 : 나는 재귀의 예제를 실행하는거야?

당신은 당신이 정의되지 않은 동작을 포함하기 때문에이 '크기'89 실제 13 (배열의 요소의 총 수() 배열의 가장 큰 요소)

sizes: size of v=52, size of v[0]=4, total elements=13 
sizes: size of v=52, size of v[0]=4, total **elements=89** 
1,1,2,2,3,3,3,3,5,6,6,7,13,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...... 

답변

3

로 변경되었습니다, 그 결과 쇼이다 배열의 size을 유효한 인덱스로 사용하십시오. 예

취하는 main 함수로부터 sy_qsort 내지 제 통화 루프

for(i = left+1; i<=right; i++) 

는 가변 right 배열의 크기 size 동일하지만 지표로는 하나이다 넘어서 마지막 성분. 조건은 i < right이어야합니다.

+1

많은 분들께 감사드립니다. 왼쪽, 오른쪽은 arry에있는 요소의 인덱스이므로 sort 함수를 호출 할 때는 다음과 같아야합니다. sy_qsort (v, 0, size-1); – sydc