2011-02-17 2 views
0

heapSort에 걸렸습니다. 나는 약간의 코드를 가지고 있지만 컴파일하는데 어려움을 겪고 있기 때문에 꽤 잘못된 것이라고 생각한다. 어떤 제안? 힙 정렬은 구현하기가 쉽지만 구문 오류가 많습니다. 여기 내 코드는 다음과 같습니다HeapSort를 구현하려고 시도했습니다.

/* Framework for Heap Sort 
* CS333 Spring 2011 
* 
*/ 
#include <stdio.h> 
#define MAX_SIZE 1000000 
int data[MAX_SIZE]; 
int n; 
int j; 

int parent(int j) { 
if(j==1) 
    return 0; 

if(j%2==0) 
    return ((j/2)-1); 
else 
    return ((j/2)); 
} 

int left(int j) { 
    return (2 * j) + 1; 
} 

int right(int j) { 
    return (2 * j) + 2; 
} 

void heapify(int data[], int j) { 
    int l = left(j), great; 
    int r = right(j); 
    if ((data[l] > data[j]) && (l < sizeof(data))) { 
    great = l; 
    } 
    else { 
    great = j; 
    } 
    if ((data[r] > data[great]) && (r < sizeof(data))) { 
    great = r; 
    } 
    if (great != j) { 
    int temp = data[j]; 
    data[j] = data[great]; 
    data[great] = temp; 
    heapify(data, great); 
    } 
} 

int BuildMaxHeap(int data[]) { 
    for (int j = (sizeof(data) - 1)/2; j >= 0; j--) { 
    heapify(data, j); 
    return data; 
    } 
} 

void HeapSort(int data[]) { 
    BuildMaxHeap(data); 
    for (int j = sizeof(data); j > 0; j--) { 
    int temp = data[0]; 
    data[0] = data[data.sizeof() - 1]; 
    data[sizeof(data) - 1] = temp; 
    sizeof(data) = sizeof(data) - 1; 
    heapify(data, 0); 
    } 

} 

int main() 
{ 
    int i; 

    /* Read in the data */ 
    n = 0; 
    while (scanf("%d", &data[n]) == 1) 
    ++n; 
    /* Sort the numbers low to high */ 

    HeapSort(data); 

    /* Print out the data */ 
    for (i = 0; i < n; ++i) 
    printf("%d", data[i]); 
} 
+1

무엇 당신의 실수인가요? – qwertymk

+0

전역 변수'j'는 필요 없습니다; 'j'가 함수에서 사용되는 곳마다, 지역 변수가 있습니다. 전역 변수'n'은 필요 없습니다; 'main()'에서 지역적이어야하고 정렬 될 요소의 수를 알아야하는 다른 함수로 전달되어야합니다. 백만개의 정수를 정렬하는 것은 사소한 일입니다. 코드를 작성한 후에는 백만 번에서 천 번까지 처리 할 수 ​​있습니다 (여분의 시간을주고받습니다). –

답변

2

문제의 대부분은 당신의 힙 정렬 루틴 것 같다 :이 같은 함수에 배열을 전달하는 경우

void HeapSort(int data[]) { 
    BuildMaxHeap(data); 
    for (int j = sizeof(data); j > 0; j--) { 

, 무슨 함수가 수신 실제로 포인터입니다. 해당 포인터에 sizeof을 사용하면 이 아님은 포인터가 가리키는 데이터의 크기를 알려줍니다. 포인터가 차지하는 바이트 수 (일반적으로 4)를 알려줍니다.

void HeapSort(int *data, size_t data_size) { 

를 루틴의 나머지 부분, 당신은 data_size하지 sizeof(data)를 참조합니다 : 당신은 아마 매개 변수로 배열의 크기를 전달하려는.

int temp = data[0]; 
data[0] = data[data.sizeof() - 1]; 
data[sizeof(data) - 1] = temp; 
sizeof(data) = sizeof(data) - 1; 

sizeof(whatever) 본질적도 아닌 상수 변수이고; 과제의 대상으로 사용할 수는 없습니다 (단, 위에 언급 된대로 data_size을 사용하여 으로 지정).

+0

data_size 또는 size_t를 어떻게 초기화해야합니까? 입력 ints는 변수 크기 thnx – user593301

+0

@ user593301 될 것입니다 : 사물의 외모에서, 당신은 그것을 배열의 요소의 수로 취급하고 있습니다. 당신의'main'에서 여러분은'n'을 사용하고있는 것처럼 보입니다. 단지 그것에 대해 명확히하기 위해,'size_t'는 타입이고,'data_size'는 그 타입의 매개 변수가 될 것입니다. –

관련 문제