追記

qsortの引数に渡す比較関数には以下のような方がいい。
単純な引き算だと, bが INT_MINで aが正の数だったらオーバーフローするため

static int compare(const void *a, const void *b)
{
    int num1 = *(int*)a;
    int num2 = *(int*)b;

    if (num2 > num1) {
        return -1;
    } else if (num2 == num1) {
        return 0;
    } else {
        return -1;
    }
}

randで生成した数だと RAND_MAXに依存するけど, Ubuntuでは INT_MAXですね.
shortの最大値ぐらいかと思っていたら違っていた