2016-10-06 8 views
0

모든 변수와 배열이 int로 정의 된 경우 내 코드가 올바르게 작동하지만 형식을 부호없는 int로 변경하면 작동하지 않습니다.배열에서 배열로 변환 할 때 힙 정렬 C가 작동하지 않습니다.

#include <stdio.h> 
#include <stdlib.h> 
void swap(unsigned int *a, unsigned int *b){ 
unsigned int temp; 
    temp=*a ; *a=*b ; *b=temp; 
} 
void heapify(unsigned int A[], unsigned int i, unsigned int n){ 
//sort from root i 

    unsigned int L = 2*i+1; 
// node left child 
    unsigned int R = 2*i+2; 
//node right child 
    unsigned int max = i; 
//set max node is root 
    if(L < n && A[L] > A[max]) max = L; 
//if node child > max, set that node is max 
    if(R < n && A[R] > A[max]) max = R; 
    if(max != i) { 
     swap(&A[i], &A[max]); 
     heapify(A, max, n);//recursive tree with root is node swaped 
     } 

} 

void buildHeap(unsigned int A[], unsigned int n){ 

    unsigned int i = n/2 - 1; 
    for(; i >= 0; i--) heapify(A, i, n); 
    } 

void heapSort(unsigned int A[], unsigned int n){ 

    buildHeap(A, n); 
    unsigned int i = n-1; 
    for(; i >= 0; i--){ 
     swap(&A[0], &A[i]); 
     heapify(A, 0, i); 
} 
} 

void PrintArray(unsigned int A[], unsigned int n){ 
    unsigned int i; 
    for(i = 0; i < n; i++){ 
     printf("%d ", A[i]); 
    } 
} 
int main(){ 
    unsigned int A[]={1,6,8,9,7,1,65,92,2,9,2,5,73,9,1,5}; 
    unsigned int n=sizeof (A)/sizeof(unsigned int); 
    PrintArray(A,n); 
    heapSort(A,n); 
    PrintArray(A,n); 
} 

출력은 기존의 배열과 아무것도 그 이후에 발생하는 인쇄에 붙어 :
다음은 내 코드입니다.

어떻게해야합니까?

+0

'i'가 서명되지 않은 경우 'i'는 항상 '> = 0'입니다. 컴파일러에서 경고해야합니다. 그렇지 않다면'-Wall'로 컴파일 해보십시오. 그리고 컴파일러가 제공하는 모든 경고를 항상 수정하십시오. – user3386109

+0

Tks guy, 당신은 내 목숨을 구하십시오. –

답변

0

문제는 buildHeap에 - 당신은 unsigned int로 반복자를 설정하고 i가 더 이상 긍정적 때까지 루프를 실행하지 - unsigned int의 현금 결코 일어나지 않을 것이다.

void buildHeap(unsigned int A[], unsigned int n){ 

    unsigned int i = n/2 - 1; 
    for(; i >= 0; i--) heapify(A, i, n); 
    } 
+0

Tks, 이제 알겠습니다. –

+0

'0'은 양의 정수가 아닙니다. 이 코드는 분명히 false가 될 수없는'> = 0'을 씁니다. @ NguyễnQuốcKhánh 컴파일러 경고를 활성화합니다. 현대의 컴파일러는 그러한 결함에 대해 경고합니다 ("조건은 거짓이 될 수 없습니다"또는 유사). 그렇지 않은 경우 더 나은 컴파일러 (예 : gcc, clang)를 얻으십시오. – Olaf