Неправильно работает 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
- Вывод отсортированного массива на экран
- Ожидание нажатия клавиши для завершения работы программы
- Завершение работы программы