2010-07-01 6 views
1

저는 이것을 몇 시간 동안보고 있었지만 이것을 이해할 수 없습니다. heapify 함수의 비교가보다 큼으로 변경되면 결과는 오름차순으로 증가합니다. 나는 내 목록 그래도 내림차순으로 정렬하고 그 아래의 코드를 사용하여 올바른 출력을 포기하지 않을거야 원하는 :힙 배열이 내림차순으로 작동하지 않습니다.

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct stuff { 
    char *str; 
}stuff_t; 

void heapify(stuff_t *stuff_array, int i, int n) 
{ 
    stuff_t temp; 
    int left, right, max; 

    left = 2*i; 
    right = left + 1; 
    max = i; 
    if (left < n) 
     if (strtod(stuff_array[left].str, NULL) < strtod(stuff_array[i].str, NULL)) 
      max = left; 
    if (right < n) 
     if (strtod(stuff_array[right].str, NULL) < strtod(stuff_array[max].str, NULL)) 
      max = right; 

    if (max != i) 
    { 
     temp = stuff_array[i]; 
     stuff_array[i] = stuff_array[max]; 
     stuff_array[max] = temp; 
     heapify(stuff_array, max, n); 
    } 
} 

void heapsort(stuff_t *stuff_array) 
{ 
    short i,N; 
    stuff_t temp; 

    N = 0; 
    while (stuff_array[N].str) 
     N++; 

    for (i = (N/2)-1; i >= 0; i--) 
     heapify(stuff_array, i, N); 

    for (i = N-1; i >= 1; i--) { 
     temp = stuff_array[0]; 
     stuff_array[0] = stuff_array[i]; 
     stuff_array[i] = temp; 
     heapify(stuff_array, 0, i); 
    } 
} 

int main (int argc, char* argv[]) 
{ 
    int i; 
    stuff_t *s_list = calloc(4, sizeof(stuff_t)); 
    stuff_t *s_list1 = calloc(8, sizeof(stuff_t)); 
    s_list[0].str = "9.3"; 
    s_list[1].str = "9.3"; 
    s_list[2].str = "7.8"; 

    printf("before: "); 
    for (i = 0; i < 3; i++) 
     printf("%s, ", s_list[i]); 
    printf("\n"); 

    heapsort(s_list); 

    printf("after: "); 
    for (i = 0; i < 3; i++) 
     printf("%s, ", s_list[i]); 
    printf("\n"); 

    s_list1[0].str = "7.5"; 
    s_list1[1].str = "10.0"; 
    s_list1[2].str = "10.0"; 
    s_list1[3].str = "8.3"; 
    s_list1[4].str = "6.5"; 
    s_list1[5].str = "5.0"; 
    s_list1[6].str = "4.6"; 

    printf("before: "); 
    for (i = 0; i < 3; i++) 
     printf("%s, ", s_list1[i]); 
    printf("\n"); 

    heapsort(s_list1); 

    printf("after: "); 
    for (i = 0; i < 7; i++) 
     printf("%s, ", s_list1[i]); 
    printf("\n"); 
    return 0; 
} 

프로그램 출력 :

// using less than comparison 
before: 9.3, 9.3, 7.8, 
after: 9.3, 7.8, 9.3, 
before: 7.5, 10.0, 10.0, 
after: 10.0, 10.0, 8.3, 7.5, 6.5, 4.6, 5.0, 

// using greator than comparison 
before: 9.3, 9.3, 7.8, 
after: 7.8, 9.3, 9.3, 
before: 7.5, 10.0, 10.0, 
after: 4.6, 5.0, 6.5, 7.5, 8.3, 10.0, 10.0, 
+0

비교를 거꾸로 수행하면서 탐색 순서를 바꾸면 어떻게됩니까? 그건 내가 처음으로 직관적 인 추측이 될거야. –

답변

4

당신은 내가 2 * 그리고 난 2 * 사용할 수 없습니다 +1을 0으로 계산하면 자녀의 주소로 +1됩니다. 문제는 2 * 0 = 0 (왼쪽 자식은 부모와 동일 함)입니다.

+0

이 경우 아이들은 무엇을해야합니까? – user318747

+0

0 인덱싱을 사용할 때 자식은 i * 2 + 1이고 i * 2 + 2입니다. –

관련 문제