2013-12-15 3 views
0

간단한 정렬 (삽입)을 구현하고 있지만 배열의 크기가 올바르지 않습니다. 즉, 내 길이 변수가 1로 설정되고 점점. 또한,이 삽입 정렬 알고리즘에 대해 내 코드를 어떻게 최적화 할 수 있습니까? 감사합니다배열의 요소 수가 예상대로 작동하지 않습니다.

void insertionSort(int a[]) 
{ 
    int sorted = 1; 
    int length = sizeof(a)/sizeof(int); 
    int i = 0; 
    int tmp; 

    printf("%d ", length); 

    if (length < 2) 
     return; 

    for (i = 1; i < length - 1; i++) 
    { 
     sorted = i; 
     while (a[sorted] < a[sorted - 1] && sorted > 0) 
     { 
      tmp = a[sorted]; 
      a[sorted] = a[sorted - 1]; 
      a[sorted - 1] = tmp; 
      sorted--; 
     } 
    } 
} 
+0

배열 길이를 인수로 전달하지 않습니까? –

답변

0
int length = sizeof(a)/sizeof(int); 

이 int 형의 크기로 나눈 포인터 (a)의 크기를 반환합니다. 항상 1과 같습니다. 당신은 함수 길이를 통과 할 것이다

, void insertionSort(int a[], size_t length){

배열이를 위해 배열 활성 소자의 수를 추적하는 생성 기능.

+0

꼭 그렇지는 않아 1 : 유닉스에서 64 비트 컴파일 인 경우 포인터의 크기는 보통 8이고 정수의 크기는 4이므로 대답은 2가됩니다. 배열. –

0

C 배열이 실제로 존재하지 않습니다. 이것은 본질적으로 C에서 배열에 대한 훌륭한 추상 지원을하지 못한다는 것을 의미합니다.이 예로서, 함수 (insertionSort)를 배열 (예 : a)로 제공하면 크기를 결정할 수 없습니다 ! 배열은 C로 크기가 없습니다.

그래서 sizeof(a)은 무엇입니까? 먼저 a은 배열이 아니라 첫 번째 요소의 메모리 주소에 대한 상수 포인터입니다. 그게 다야. 그런 다음 sizeof(a)은 포인터 a의 크기를 알려줍니다.

C로 배열을 관리하려면 변수를 사용하여 길이를 저장해야합니다. 이것이 배열을 다루는 대부분의 함수가 추가 매개 변수 length을 갖는 이유입니다.

관련 문제