2016-10-06 19 views
0

Мой код работает правильно, когда все переменные и массив определены как int, но если я изменю тип на unsigned int, это не сработает.
Вот мой код:Heap Sort C не работает при изменении от массива до массива unsigned int

#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', что действительно не может стать ложным. @ NguyễnQuốcKhánh Включить предупреждения компилятора. Любой современный компилятор будет предупреждать о таких недостатках («условие не может стать ложным» или аналогичным). Если у вас нет, получите лучший компилятор (например, gcc, clang). – Olaf

 Смежные вопросы

  • Нет связанных вопросов^_^