Неправильно работает 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);
- }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с функцией сортировки и генерацией случайных чисел
- Объявление двух функций сравнения для сортировки массива по убыванию и возрастанию
- Создание массива из 10 элементов сгенерированных случайным образом в диапазоне от -50 до 50
- Вывод содержимого массива на экран
- Сортировка массива в порядке убывания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_dec
- Вывод отсортированного массива на экран
- Сортировка массива в порядке возрастания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_inc
- Вывод отсортированного массива на экран
- Ожидание нажатия клавиши для завершения работы программы
- Объявление функции main()
- Инициализация генератора случайных чисел
- Определение размера массива и инициализация его элементов
- Генерация случайных чисел в указанном диапазоне и заполнение ими массива
- Вывод содержимого массива на экран
- Сортировка массива в порядке убывания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_dec
- Вывод отсортированного массива на экран
- Сортировка массива в порядке возрастания с помощью функции qsort_s и передачей в нее функции сравнения qss_cmp_int_inc
- Вывод отсортированного массива на экран
- Ожидание нажатия клавиши для завершения работы программы
- Завершение работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д