2017-10-19 6 views
0

내 프로그램을 실행할 때 잘못된 출력을 얻었습니다. 원인을 알 수있는 단서가 없습니다.삽입 정렬에서 잘못된 출력

아래에서 확인할 수 있듯이 배열이 있습니다. 그러나 프로그램을 실행할 때 출력을 얻습니다 :

array[0]=3 
array[1]=1 
array[2]=1 
array[3]=5 
array[4]=5 
array[5]=8 

명백히 {1,3,4,5,7,8}이 될 것으로 예상되는 출력이 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

#include <stdio.h> 
#include <stdlib.h> 
#define l 6 

void isnertionSort(int array[]); 

int main(void) 
{ 
    int array[l]={3,4,1,7,5,8}; 

    for(int i=0; i<l;i++) { 
    printf("array[%d]=%d\n", i, array[i]); 
    } 
    printf("\n"); 

    isnertionSort(array); 

    for(int i=0; i<l; i++){ 
    printf("array[%d]=%d\n", i, array[i]); 
    } 

    return 0; 
} 


void isnertionSort(int array[]) 
{ 
    int j,key; 
    for(int i =1;i<l;i++){ 
    key = array[i]; 

    j = i -1; 

    while(j>0 && array[j]>key){ 
     array[j+1]=array[i]; 
     j--;//j=j-1                         

    } 
    array[j+1]= key; 
    } 
} 
+2

예를 들어 [어떻게 작은 디버깅하는 방법 (프로그램을 디버깅하는 방법을 학습하십시오이다 프로그램] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)). 디버거를 사용하여 단계별로 수행하는 방법 및/또는 잘못된 것을 식별하는 인쇄 문을 추가하는 방법을 배워야합니다. 따라서, 몇 가지 샘플 입력 데이터와 예상 및 실제 출력 (MCVE - MCVE 생성 방법에 대한 정보)을 제공해야합니다. –

+1

이동할 때 배열의 요소를 덮어 쓰는 것처럼 보입니다. 디버거는 이런 종류의 문제를 확인하는 훌륭한 도구입니다. –

+0

질문이 해결되면 대답을 수락하고 질문을 조입니다. 비슷한 [조언]을 이미 받았습니다 (https://stackoverflow.com/questions/46758008/c-compiler-error-which-i-am-unable-to-locate#comment80461712_46758008). 응답이 "받아 들여질 때"는 무엇을 의미합니까?를보십시오.] (https://stackoverflow.com/help/accepted-answer) – BLUEPIXY

답변

1

내부 루프에는 2 개의 사소한 버그가 있습니다.

구현을 insertion sort 알고리즘과 비교하면 디버그하는 것이 간단합니다. 또한 이러한 종류의 버그가 더 쉽게 발견 될 수 있도록 코드를 들여 쓰면 도움이됩니다.

+0

아. 그것을 해결해 주셔서 감사합니다! – oxodo

1

처음에는 머리글에서 선언문을 <stdlib.h>으로 사용하지 않았습니다. 그래서 지침은

#include <stdlib.h> 

이 제거 될 수 있습니다.

# 정의 된 이름에 대문자를 사용하는 것이 훨씬 좋습니다. 예를

#define N 6 

를 들어 코드의 독자 낮은 경우 문자 l1을 구분하기가 어렵습니다.

고정 된 6 개 요소 만있는 배열을 허용 할 수있는 함수 대신 일반적인 정렬 함수를 작성해야합니다. 그래서 함수는 두

void isnertionSort(int array[], size_t n); 

이 루프

while(j>0 && array[j]>key){ 
    array[j+1]=array[i]; 
    j--;//j=j-1                         

} 

1) 0 및 1과 동일한 인덱스를 가진 배열 소자에 접촉하지 않는 예로서 파라미터 2) 세트 선언해야 keyarray[i]이 모두 동일한 값이므로 key의 키보다 큰 모든 요소 다음과 같은 방법을 볼 수 계정으로 프로그램을 모든 촬영

array[j+1]=array[i]; 
      ^^^^^^^^ 

#include <stdio.h> 

#define N 6 

void isnertionSort(int array[], size_t n); 

int main(void) 
{ 
    int array[N] ={ 3, 4, 1, 7, 5, 8 }; 

    for (size_t i = 0; i < N; i++) 
    { 
     printf("array[%zu] = %d\n", i, array[i]); 
    } 
    putchar('\n'); 

    isnertionSort(array, N); 

    for (size_t i = 0; i < N; i++) 
    { 
     printf("array[%zu] = %d\n", i, array[i]); 
    } 
    putchar('\n'); 

    return 0; 
} 

void isnertionSort(int array[], size_t n) 
{ 
    for(size_t i = 1; i < n; i++) 
    { 
     size_t j = i; 
     int value = array[i]; 

     for (; j != 0 && value < array[j-1]; --j) 
     { 
      array[j] = array[j-1]; 
     } 

     if (j != i) array[j] = value;   
    } 
} 

프로그램 출력은

array[0] = 3 
array[1] = 4 
array[2] = 1 
array[3] = 7 
array[4] = 5 
array[5] = 8 

array[0] = 1 
array[1] = 3 
array[2] = 4 
array[3] = 5 
array[4] = 7 
array[5] = 8