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

Ваш аккаунт

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

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

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

qsort: сортировка 2мерного массива типа double

3.2K
17 апреля 2007 года
Gazzy
38 / / 02.08.2006
нужно отсортировать 2 мерный массив типа double по одному из столбцов с помощью qsort(). как написать пользовательскую функцию сортировки? может есть где простой пример как реализовать сортировку? (готовый алгоритм не предлагать :) )
242
17 апреля 2007 года
Оlga
2.2K / / 04.02.2006
а зайти в полезные ссылки? да сходить на сайты с алгоритмами? воспользоваться поиском тоже не помешает...
тема для раздела Студентам.

быстрая сортировка
2.1K
17 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: Gazzy
нужно отсортировать 2 мерный массив типа double по одному из столбцов с помощью qsort(). как написать пользовательскую функцию сортировки? может есть где простой пример как реализовать сортировку? (готовый алгоритм не предлагать :) )

Чем отличается пример от готового алгоритма?

Код:
rows - количесвто строк
cols - количество столбцов
col  - глобальная переменная сод.номер столбца

double mass[rows][cols];

int compare(const void *arg1, const void *arg2)
{  
  return (*((double *)arg2 + col) - *((double *)arg1 + col) < 0) ? 1 : -1;
}

qsort(&mass[0][0], rows, sizeof(double)*cols, compare);
3.2K
18 апреля 2007 года
Gazzy
38 / / 02.08.2006
Спасибо всем! Насчет готового алгоритма я немного не точно выразился, имел в виду готовую программу, исходник которой нельзя посмотреть. :)
3.2K
18 апреля 2007 года
Gazzy
38 / / 02.08.2006
а если вместо 2мерного массива массив структур и струкьтуры нужно упорядочить по одному из членов????
2.1K
18 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: Gazzy
а если вместо 2мерного массива массив структур и струкьтуры нужно упорядочить по одному из членов????


Код:
unsigned int offset - глобальная переменная
N - размер массива

struct PERSON              
{
   int   age;              
   int   ss;
   float weight;
   char  name[25];
};

PERSON mass[N];  

Тогда для сортировки по полю name

offset = (unsigned int)&mass[0].name - (unsigned int)&mass[0];

qsort(&mass[0], N, sizeof(PERSON), compare);

int compare(const void *arg1, const void *arg2)
{  
  return strcmp((char *)(unsigned int)arg1 + offset,(char *)(unsigned int)arg2 + offset);
}

Для сортировки по полю ss

offset = (unsigned int)&mass[0].ss - (unsigned int)&mass[0];

qsort(&mass[0], N, sizeof(PERSON), compare);

int compare(const void *arg1, const void *arg2)
{  
  return *(int *)((unsigned int)arg1 + offset) - *(int *)((unsigned int)arg2 + offset);
}

Не исключено, что offset можно определить и более стандартным способом.
.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог