Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.212.145] |
|
Сообщ.
#1
,
|
|
|
Есть таблица, при клике по заголовку столбца должна происходить сортировка данных по строкам (например как в проводнике).
Данные в таблице заданы массивом символов data[50][500][256], где максимально возможные значения : 50 столбцов x 500 строк x 256 символлов в ячейке. Вопрос : Как отсортировать таблицу ? |
Сообщ.
#2
,
|
|
|
E.A., по сути - тут все элементарно, для 500 строк для qsort переполнения стека и не близко не будет.
Вопрос в другом, в "дизайне" массива. Нужно правильно определить порядок, а именно - первое измерение это строки, второе - это столбцы, и последнее символы в столбце. В таком вот случае в функции qsort будут передаваться строки для сравнения в функцию сравнения. Соответственно, для реализации сортировки по столбцу в этой функции сравнения нужно сравнивать данные нужного столбца (поля). Все решается приведением типов в функции сравнения и применении собственно операции сравнения двух строк. |
Сообщ.
#3
,
|
|
|
В вашем случае, E.A., будет как-то так:
char data[50][500][256]; int sortCol=2; // колонка int compare( const void *a, const void *b) { return strcmp( (char*)a, (char*)b ); } ... qsort( (void*)(data[sortCol]), 500, 256, compare); Добавлено Насчёт последней строки не уверен, так надёжнее будет: qsort( (void*)(&data[sortCol][0][0]), 500, 256, compare); Добавлено Ай, виноват, так только кликнутая колонка и отсортируется. Пардон-с. Добавлено Тогда б я посоветовал взять исходник qsort'а (благо она крохотная) и там операцию перемещения пары элементов заменить на нужное перемещение в вашей базе, E.A., раз уж она имеет такое строение строк в памяти. Будет архибыстро и весьма лаконично. Но "костылёк" с ГОСТовским qsort'ом, бесспорно, можно и помучать; но надо колдовать... (чую, что надо бы сначала индексы посортировать, а потом уж базой заняться). |
Сообщ.
#4
,
|
|
|
Цитата Славян @ Ай, виноват, так только кликнутая колонка и отсортируется. Как же это произойдёт ? Любая сортировка делает сравнение и "swap". (Отличия алгоритмов - это, в основном, отличия в алгоритмах выбора индексов массива для манипулирования объектами) Данная функция делает swap для 32-х битных значений. Но ни как не строк. --- Эту функцию можно было бы удобно использовать, если бы кроме пользовательской функции сравнения она вызывала пользовательскую функцию "swap". --- Теоретически возможен вариант - составим массив указателей на строки. Тогда можно отсортировать строки перестановкой указателей. Но в данном случае надо также переставлять строки в других столбцах. Поскольку совокупность содержимого ячеек одной строки таблицы это один объект сортировки. --- Тогда получается как-то так: 1. Изначальный массив с данными не будем изменять, результат будет в аналогичном массиве. Заполняем его читая таблицу. 2. Составляем массив [500] указателей на строки выбранного для сортировки столбца. 3. Сортируем указатели указанной процедурой 4. Потом ищем каждый из указателей отсортированного массива указателей в изначальном массиве с выбранным столбцом. В результате получим два индекса - старого размещения и нового. 5. Найденный указатель покажет нам, с какого и на какое место должна быть пернесена информация всего ряда ячеек (всех столбцов). Копируем все строки по всем столбцам из изначального массива со старым индексом в массив результата с новым индексом. 6. Массив результата выведем в таблицу. |
Сообщ.
#5
,
|
|
|
Цитата E.A. @ Данные в таблице заданы массивом символов data[50][500][256], где максимально возможные значения : 50 столбцов x 500 строк x 256 символлов в ячейке. А здесь разве не вот такой массив должен быть - data[500][50][256]? Т.е. 500 строк, каждая из которых состоит из 50 х 256 символов. Ну и сортировать сам этот массив смысла нет - нужно сделать ещё один - массив указателей или индексов строк и сортировать его, и отображать в таблице тоже его. |
Сообщ.
#6
,
|
|
|
надо всего лишь изменить алгоритм сравнения строк. Добавлено В Сети легко можно найти описание и исходники широко используемых алгоритмов сортировки: - пузырьковая сортировка - сортировка выбором - сортировка вставками - шейкерная сортировка (разновидность пузырьковой сортировки) - сортировка Шелла - быстрая сортировка Наверняка подберёшь что-нибудь подходящее. |