힙소트 도와주실 수 있을까요

overflowww의 이미지

#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

어떤 이유에서 무엇을 원하는데 무엇이 나와서 문제라고 생각하는 것인지요? 글을 잘 쓰는 것이 생각하는 능력이고 프로그래밍 능력이에요. 그 연습이라고 생각하고 질문을 잘 가다듬어보세요.

overflowww의 이미지

힙의 조건을 만족하지 않기때문에 재구성을 하잖아요? 그 재구성동안 일어나는 원소 교환의 횟수를 출력해야 하는데 제가 예상한값보다 카운트가 더 많이 나와버려요
헷갈리는 이유는 정렬은 잘 되는데 카운트가 예상값보다 높아서 어딜 손대야할지 감이 안오네요..

...!의 이미지

> 헷갈리는 이유는 정렬은 잘 되는데 카운트가 예상값보다 높아서 어딜 손대야할지 감이 안오네요..

그러면 apleshade님이 예상한 값이 잘못된 것인지, 카운트하는 방법이 잘못된 것인지 어찌알지요? 최소한 어떤 입력에 대해서 본인이 예상한 값이 얼마인데 얼마가 나온다고 몇 가지 예를 들어야하지 않겠어요? 어째서 apleshade님이 그 값을 예상했는지를 간결하게 서술할 수 있다면 훨씬 좋구요. 시도해보세요. 그리고 "다시 말씀드리지만" <code> 블록을 사용하세요.

overflowww의 이미지

아, 샘플인풋이랑은 교수님이 미리 올려준 내용이라서 알고있어요. 따로 제가 계산은 한게 아니여가지고....

익명 사용자의 이미지

헛웃음이 안오네요. 스스로 계산해보고 질문을 다시 하세요. 대답해드릴 수 있는 질문이 아니네요.

overflowww의 이미지

아, 샘플인풋이랑은 교수님이 미리 올려준 내용이라서 알고있어요. 따로 제가 계산은 한게 아니여가지고....

overflowww의 이미지

인자값을 전달할때 length 대신 length-1을 넣으면 카운트값이 맞는데 정렬이 완전하지가 않구요
0 7 1 6 7 7 6 6 5 4 를 넣으면 0156667774 이렇게 나오는 식으로요

 의 이미지

직접 짜신 코드 아닌가요?

직접 짜셨다면 heapify, buildHeap 또는 HeapSort 함수에서 인자 n이 배열의 크기(length)여야 하는지 마지막으로 유효한 인덱스의 값(length-1)이어야 하는지 선택하셨을 텐데요.

어느 쪽으로 선택했든 일관성만 지킨다면 아무 상관 없는 문제이기 때문에 되려 제3자가 추론하기 어렵습니다.
코드를 읽고 분석해본다면야 알 수 있겠지만 코드를 작성하신 분께 묻는 게 제일 간편하지요.

직접 짜신 코드이지만 어떤 가정 하에서 어떻게 동작하는지 스스로도 감을 못 잡으신다면, 그런 코드를 이해해 줄 사람을 찾기는 어려우실 겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.