Неправильно работает 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 с отрицательными числами»

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);
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с функцией сортировки и генерацией случайных чисел
  2. Объявление двух функций сравнения для сортировки массива по убыванию и возрастанию
  3. Создание массива из 10 элементов сгенерированных случайным образом в диапазоне от -50 до 50
  4. Вывод содержимого массива на экран
  5. Сортировка массива в порядке убывания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_dec
  6. Вывод отсортированного массива на экран
  7. Сортировка массива в порядке возрастания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_inc
  8. Вывод отсортированного массива на экран
  9. Ожидание нажатия клавиши для завершения работы программы
  10. Объявление функции main()
  11. Инициализация генератора случайных чисел
  12. Определение размера массива и инициализация его элементов
  13. Генерация случайных чисел в указанном диапазоне и заполнение ими массива
  14. Вывод содержимого массива на экран
  15. Сортировка массива в порядке убывания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_dec
  16. Вывод отсортированного массива на экран
  17. Сортировка массива в порядке возрастания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_inc
  18. Вывод отсортированного массива на экран
  19. Ожидание нажатия клавиши для завершения работы программы
  20. Завершение работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы