Неправильно работает qsort с отрицательными числами - C (СИ)

Формулировка задачи:

Здравствуйте. При использовании функции qsort - программа неправильно сортирует отрицательные числа. Например: "-40 -30 -20 -10 2 4 5 3" сортирует как "-10 -20 -30 -40 2 3 4 5". Написал свою функцию по алгоритму, она так же неправильно работает.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void q_sort(int *numbers, int left, int right) {
  int pivot, l_hold, r_hold;
  l_hold = left;
  r_hold = right;
  pivot = numbers[left];
  while (left < right) {
    while ((numbers[right] >= pivot) && (left < right))
      right--;
    if (left != right) {
      numbers[left] = numbers[right];
      left++;
    }
    while ((numbers[left] <= pivot) && (left < right))
      left++;
    if (left != right) {
      numbers[right] = numbers[left];
      right--;
    }
  }
  numbers[left] = pivot;
  pivot = left;
  left = l_hold;
  right = r_hold;
  if (left < pivot)
    q_sort(numbers, left, pivot-1);
  if (right > pivot)
    q_sort(numbers, pivot+1, right);
}
int main() {
    int n, i,j;
    setlocale(LC_ALL,"Russian");
    printf("Введите количество элементов: ");
    scanf("%d",&n);
    float a[n];
    for (i=0;i<n;i++){
        scanf("%f",&a[i]);
    }
    q_sort(a,0,n-1);
    for(i=0;i<n;i++)
    printf("%.2f ",a[i]);
    return(0);
 }
Что я делаю не так?(

Код к задаче: «Неправильно работает qsort с отрицательными числами - C (СИ)»

textual
#include <iostream>
#include <ctime>
 
int qss_cmp_int_dec(void* null, const void* x, const void* y);
int qss_cmp_int_inc(void* null, const void* x, const void* y);
 
void main() {
    srand((size_t)time(0));
    const size_t Len = 10; int Arr[Len];
    for (int i = 0; i < Len; ++i) Arr[i] = rand() % 101 - 50;
 
    for (int i = 0; i < Len; ++i) printf("%d ", Arr[i]); puts("");
 
    qsort_s(Arr, Len, sizeof(int), qss_cmp_int_dec, 0);
 
    for (int i = 0; i < Len; ++i) printf("%d ", Arr[i]); puts("");
 
    qsort_s(Arr, Len, sizeof(int), qss_cmp_int_inc, 0);
 
    for (int i = 0; i < Len; ++i) printf("%d ", Arr[i]); puts("");
 
    system("pause");
}
 
// по убыванию
int qss_cmp_int_dec(void* null, const void* x, const void* y) {
    return (*(int*)y - *(int*)x);
}
 
// по возрастанию
int qss_cmp_int_inc(void* null, const void* x, const void* y) {
    return (*(int*)x - *(int*)y);
}

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

12   голосов, оценка 3.917 из 5


СОХРАНИТЬ ССЫЛКУ