Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Функция qsort сортирует не полностью верно

44K
30 ноября 2009 года
Bonez92
37 / / 25.08.2009
Проблема: Вот исходный код:
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int compare (const void * a, const void * b)
{
  return (int)( *(double*)a - *(double *)b );
}


int main()
{
    double d_temp, // Временная переменная
           *m;     // Наш массив
    int size,      // Размер массива
        i;         // Счетчик
   
    printf ("Programma sortirovki i analiz sortirovki\n\n");
   
    // Приглашение ввести размерность массива
    printf ("Vvedite razmernost' massiva:");
    scanf ("%lf", &d_temp);
   
    // Проверка введенных данных
    while ((d_temp<1) || (fabs(d_temp-ceil(d_temp))>1.e-32))
    {
        printf ("Vvedite razmernost' massiva:");
        scanf ("%lf", &d_temp);
    }
    size=(int)d_temp;
   
    // Если размерность массива равен 1
    if (size==1)
    {
        printf ("Oshibka: sortirovat' nechego\n");
        return 0;
    }
   
    // Выдиление динамической памяти для массива
    m=(double*)malloc(size*sizeof(double));
   
    // Инициализация генератора случайных чисел
    srand((unsigned)time(NULL));
   
    // Наполнение динамической памяти элементами (от -10 до 10) и выводы их значений
    for (i=0; i<size; i++)
    {
        m=(double)rand()/(RAND_MAX+1)*20-10;
        printf ("m[%d]=%lf\n", i, m);
    }
   
    // Начало
    qsort(m, size, sizeof(double), compare);
   
    printf ("\n");

    for (i=0; i<size; i++)
    {
        printf ("m[%d]=%lf\n", i, m);
    }
    free(m);
    return 0;
}

Теоретически программа должна выводить сначала начальные данные, затем вывести данные по возрастанию. Но qsort сортирует "не полостью верно". Пример результата:
m[0]=-9.783325
m[1]=-7.217407
m[2]=-8.132935

m[3]=-3.205566
m[4]=-1.138306
m[5]=-2.065430

m[6]=0.677490
m[7]=0.004272
m[8]=1.956177
m[9]=1.948242

m[10]=1.348267
m[11]=4.169312
m[12]=4.981689
m[13]=6.091309
m[14]=7.343140


Вопрос: Такое получается из-за неверного вызова функции qsort или сама функция является "ненадежной"?

ЗЫ: Извиняюсь, что не там создал тему. Это одно из заданий лабы по программированию. Можно было создавать в "C/C++/C# - общие вопросы".
12K
30 ноября 2009 года
Ghox
297 / / 26.07.2009
Цитата: Bonez92

Теоретически программа должна выводить сначала начальные данные, затем вывести данные по возрастанию. Но qsort сортирует "не полостью верно". Пример результата:
m[0]=-9.783325
m[1]=-7.217407
m[2]=-8.132935

m[3]=-3.205566
m[4]=-1.138306
m[5]=-2.065430

m[6]=0.677490
m[7]=0.004272
m[8]=1.956177
m[9]=1.948242

m[10]=1.348267
m[11]=4.169312
m[12]=4.981689
m[13]=6.091309
m[14]=7.343140


Вопрос: Такое получается из-за неверного вызова функции qsort или сама функция является "ненадежной"?


Проблема в вашей функции compare, которую вы используете в функции qsort:

 
Код:
int compare (const void * a, const void * b)
{
  return (int)( *(double*)a - *(double *)b );
}

Для сравнения чисел, вы делаете вычитание двух чисел double, и результат вычитания преобразуете в int. Если разность двух чисел будет больше нуля и меньше единицы, то при преобразовании в int получится ноль и функция compare соответственно вернет 0, что для функции qsort означает, что два сравниваемых при сортировке числа равны. И соответственно перестановку этих чисел она не произведет.

Возможно, что то же самое будет, если разность будет больше -1 но меньше нуля, но не уверен.

Вам нужно переписать compare - вместо простого cast в int результата вычитания double, сделать более сложную проверку.
44K
30 ноября 2009 года
Bonez92
37 / / 25.08.2009
Я переписал функцию compare:
Код:
int compare (const void * a, const void * b)
{
    if ((*(double*)a-*(double *)b)>0)
    {
        return 1;
    }
    if ((*(double*)a-*(double *)b)<0)
    {
        return -1;
    }
    return 0;
}

Так массив сортируется полностью.
Теперь я более менее понял про роль такой функции.
Ghox - выражаю благодарность за ваш ответ.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог