게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c언어 삽입정렬 질문이요!
게시물ID : programmer_22215짧은주소 복사하기
작성자 : 로랜드의피
추천 : 0
조회수 : 582회
댓글수 : 5개
등록시간 : 2018/03/22 05:27:12
옵션
  • 본인삭제금지
제가짠 코드입니다.

오름차순으로 정렬할 때, 배열 내의 원소들의 이동회수를 출력하는 프로그램인데요

 입력

10
0 7 1 6 7 7 6 6 5 4 

출력

30


대체 어느 부분에서 오류가 난건지 모르겠습니다. 디버깅좀 부탁드리겠습니다.




#include<stdio.h>

int main()
{
 int A[10000];
 int i,n;
 printf("");
 scanf("%d",&n);
 for(i=0; i<n; i++)
 {
    scanf("%d",&A[i]);
 }
 insertion(A,n);
 return 0;
}

void insertion(int A[], int n)
{
 int i,j,tmp,count=0;
 for(i=0; i<n; i++)
 {
   for(j=i-1; j>=0; j--) 
   {
    count ++;
    if(A[j]>A[j+1])
    {
      tmp=A[j];
      A[j]=A[j+1];
      A[j+1]=tmp;
    }
    else
      break;
   }
 }
 printf("%d",count);
}
전체 추천리스트 보기
2018-03-22 09:21:47추천 2
디버깅이 개발자의 능력이고 역량입니다. 해보고 "어? 안되네?" 에서 끝나는게 아니라 "왜 안되지?"를 끊임없이 끝없이 찾아야 합니다.

기본적으로는 컴파일시 컴파일러가 무엇이 문제인지 알려줍니다. (문법이나 컴파일러 레벨에서 찾을 수 있는 에러/경고) 어디가 문제인지 컴파일러가 알려주는데 그것도 첨부 안하고 소스만 올린건 에러를 아예 안봤다는 의미같네요. 어디가 틀렸는지는 컴파일러에 나옵니다.

컴파일은 정상적으로 되는데 기능적으로 의도한대로 동작하지 않을 수 있습니다. 이런 경우가 진짜 '디버깅'입니다. 간단하게는 printf 등을 이용해 값을 출력해보며 계산결과가 정확한지 한단계 한단계 찾아나갈 수 있고 ide에서 제공해주는 기능을 활용할 수도 있습니다. linux환경이라면 gdb 등의 디버깅 툴을 이용할 수도 있어요.

프로그래밍은 고난과 역경의 연속입니다. 매번 하나하나 질문글 올리고 답변 기다릴 여유 없어요. 스스로 찾고 연구하고 노력해야 합니다.

그리고 코드의 한 부분을 보니 아직 자기가 짠 코드를 한줄한줄 이해하지 못하시는거 같은데, printf("")은 어떤 의도입니까?
댓글 3개 ▲
2018-03-22 10:36:08추천 0
정말 친절하시네요 ㅎㅎ

100% 동의 합니다.
2018-03-22 13:31:40추천 0
옳은 말씀입니다만
저도 제코드 여러번보다가 혹시나 제가 모르는부분에서 오류가 있나,가벼운 도움을 얻을수 있을까해서 올려본겁니다 뭐 과제를 부탁한것도 아니고 이글을 올려놓고 댓글달리겠지 한것도 아닙니다.
자기가 연구해서 찾는다면 성장에 도움이되겠지만
때때로는 질답을 통해 빠르게 잡아내는것도 도움이 될수도 있는 부분이라고 생각됩니다.
2018-03-22 13:45:21추천 0
질문하는 법을 배워 봅시다.
https://youtu.be/LjcMes6LJHs

그리고 이런 간단한 논리적인 문제는 혼자 풀어야 더 더움이 되요,
2018-03-22 11:30:18추천 0
맨날 insertion하고 selection하고 헷갈렸어서 insertion은 뭐였드라 하면서 코드를 봤더니만 이건 bubble이네요.
실패!
https://visualgo.net/bn/sorting 참고하세요.

사족(insert하고 select하고 다시 확인한 김에. ㅋㅋ)
물론 보통은 quick을 쓰면 해피하긴 하지만 다른 정렬수단을 배우는 이유는 아이디어를 배울 수 있다는 점외에 실무차원에서도 의미가 있어요.
selection은 제일 작은것, 혹은 제일 큰것을 찾아서 원하는 자리에 넣는 알고리즘이라 swap은 많아야 N번 일어납니다. 반면 비교는 O(N^2)번 일어나지요.
insertion은 이미 정렬된 배열에 값을 채워넣는 방식이라 swap은 O(N^2)번 일어나지만(linked list이면 swap도 O(N)번) 비교는 이미 정렬된 상태라 O(N log N) 번만 일어나지요.
그래서 비교가 느리고 swap이 빠른경우엔 insertion, 비교가 빠르고 swap이 느린경우엔 selection이 더 좋습니다. ( 극단적인 경우를 생각해보면 이게 quick보다 더 좋은걸 알 수 있을겁니다. )
즉 어떤 정렬알고리즘이 단순이 더 좋다 빠르다라고 말하는건 80점짜리 대답이고 데이터의 형태와 연산의 비용에 따라 최적의 알고리즘이 다르고 저런 예를 말할 수 있으면 최고입니다.
( 면접관의 습관이 남아있나봅니다. -_- )
댓글 0개 ▲
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호