2016-10-06 5 views
0

すべての変数と配列がintとして定義されていると、コードが正常に動作しますが、型をunsigned intに変更すると機能しません。配列から配列unsigned 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男、あなたは人生を救う。 –

答えて

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」は正の整数ではありません。コードは明らかに '> = 0'を書いていますが、実際にはfalseになることはできません。 @NguyễnQuốcKhánhコンパイラの警告を有効にします。現代のコンパイラは、このような欠陥について警告します(「条件は偽になることはありません」など)。あなたが持っていない場合は、より良いコンパイラ(gcc、clangなど)を入手してください。 – Olaf

関連する問題