Cóż, błędem przez który ukazują się liczby ujemne jest druga pętla for, w której iterujesz się do N-1(ostatniego indeksu tablicy), a potem odwołujesz się do indeksu j+1. To powoduje odczytanie losowej wartości z pamięci, która widocznie akurat jest ujemna. Trzeba zmniejszyś zakres o 1. Drugim błędem jest zamiana elementów, powinieneś użyć zmiennej z w drugim przypisaniu, bo inaczej nadpisujesz sobie zmienną i potem ją używasz.
#include <stdio.h>
#define N 5
int main() {
int tab[N] = { 4, 5, 1, 3, 2 };
for (int i = 0; i < N; i++) {
for (int j = 0; j < N-1; j++) {
if (tab[j] > tab[j+1]) {
int z;
z = tab[j];
tab[j] = tab[j+1];
tab[j+1] = z;
}
}
}
for (int i = 0; i < N; i++) {
printf("%d", tab[i]);
}
return 0;
}
Wydaje mi się, że w takiej postaci już powinno działać.