힙소트 도와주실 수 있을까요
#include
int count = 0;
int heapify(int arr[],int k, int n)
{
int max,temp;
int last = ((n+1) >> 1);
while(k < last)
{
int left = (k <<1) + 1;
int right = left+1;
if ( right <= n)
{
if(arr[left] <= arr[right])
max = right;
else
max = left;
}
else
max = left;
if(arr[max] > arr[k])
{
temp = arr[k];
arr[k] = arr[max];
arr[max] = temp;
count ++;
k = max;
}
else
break;
}
}
int buildHeap(int arr[],int n)
{
int i;
for(i = n/2;i>=0;i--)
{
heapify(arr,i,n);
}
}
void HeapSort(int arr[], int n)
{
int temp;
buildHeap(arr,n-1);
for(int i = n-1; i>0;i--)
{
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//count ++;
heapify(arr,0,i-1);
}
}
int main()
{
int i,length,arr[10000];
scanf("%d", &length);
if(length < 1)
return 1;
for( i = 0; i
{
scanf("%d",&arr[i]);
}
length = i;
HeapSort(arr,length-1);
printf("%d\n",count);
for(int k = 0; k
{
printf("%d",arr[k]);
}
return 0;
}
힙소트를 돌릴때 맥스힙을 재구성하잖아요
그때 일어나는 교환 횟수를 카운트해서 출력을 해줘야하는데
정렬이랑은 분명히 잘 되는데 count값이 계속 15가 나오네요
main함수에서 HeapSort(arr,length); 에서 length -1 로 바꿔주면 count값이 맞기는 한데
그러면 정렬값이 원래 0145666777이 나와야하는데 0156667774 로 나와버려요
sample input
10
0 7 1 6 7 7 6 6 5 4
sample output
12
https://kldp.org/node/157271
https://kldp.org/node/157271
어떤 이유에서 무엇을 원하는데 무엇이 나와서 문제라고 생각하는 것인지요? 글을 잘 쓰는 것이 생각하는 능력이고 프로그래밍 능력이에요. 그 연습이라고 생각하고 질문을 잘 가다듬어보세요.
최대값을 빼내면 힙
힙의 조건을 만족하지 않기때문에 재구성을 하잖아요? 그 재구성동안 일어나는 원소 교환의 횟수를 출력해야 하는데 제가 예상한값보다 카운트가 더 많이 나와버려요
헷갈리는 이유는 정렬은 잘 되는데 카운트가 예상값보다 높아서 어딜 손대야할지 감이 안오네요..
> 헷갈리는 이유는 정렬은 잘 되는데 카운트가
> 헷갈리는 이유는 정렬은 잘 되는데 카운트가 예상값보다 높아서 어딜 손대야할지 감이 안오네요..
그러면 apleshade님이 예상한 값이 잘못된 것인지, 카운트하는 방법이 잘못된 것인지 어찌알지요? 최소한 어떤 입력에 대해서 본인이 예상한 값이 얼마인데 얼마가 나온다고 몇 가지 예를 들어야하지 않겠어요? 어째서 apleshade님이 그 값을 예상했는지를 간결하게 서술할 수 있다면 훨씬 좋구요. 시도해보세요. 그리고 "다시 말씀드리지만" <code> 블록을 사용하세요.
답안은
아, 샘플인풋이랑은 교수님이 미리 올려준 내용이라서 알고있어요. 따로 제가 계산은 한게 아니여가지고....
헛웃음이 안오네요. 스스로 계산해보고 질문을 다시
헛웃음이 안오네요. 스스로 계산해보고 질문을 다시 하세요. 대답해드릴 수 있는 질문이 아니네요.
답안은
아, 샘플인풋이랑은 교수님이 미리 올려준 내용이라서 알고있어요. 따로 제가 계산은 한게 아니여가지고....
메인함수에서
인자값을 전달할때 length 대신 length-1을 넣으면 카운트값이 맞는데 정렬이 완전하지가 않구요
0 7 1 6 7 7 6 6 5 4 를 넣으면 0156667774 이렇게 나오는 식으로요
직접 짜신 코드 아닌가요?
직접 짜신 코드 아닌가요?
직접 짜셨다면 heapify, buildHeap 또는 HeapSort 함수에서 인자 n이 배열의 크기(length)여야 하는지 마지막으로 유효한 인덱스의 값(length-1)이어야 하는지 선택하셨을 텐데요.
어느 쪽으로 선택했든 일관성만 지킨다면 아무 상관 없는 문제이기 때문에 되려 제3자가 추론하기 어렵습니다.
코드를 읽고 분석해본다면야 알 수 있겠지만 코드를 작성하신 분께 묻는 게 제일 간편하지요.
직접 짜신 코드이지만 어떤 가정 하에서 어떻게 동작하는지 스스로도 감을 못 잡으신다면, 그런 코드를 이해해 줄 사람을 찾기는 어려우실 겁니다.
댓글 달기