2010-07-01 43 views
1

我一直在寻找这个小时,并不能解决这个问题。如果heapify函数中的比较变为大于,那么输出按照应有的顺序升序排列。我想,虽然递减顺序进行排序我的列表,并使用下面的代码它不给正确的输出:Heapsort降序不起作用

#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

如果您颠倒遍历顺序并反转比较会发生什么?那将是我第一个直觉的猜测。 – 2010-07-01 17:06:24

回答

4

不能使用我* 2和我* 2 +1作为孩子的地址,如果你从0开始计数。问题是2 * 0 = 0(左边的孩子将和父母一样)。

+0

在这种情况下,孩子应该做什么? – user318747 2010-07-01 17:43:32

+0

使用0-索引时,孩子们是我* 2 + 1和i * 2 + 2。 – 2010-07-01 17:48:49