На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> Сортировка , Си
    Есть таблица, при клике по заголовку столбца должна происходить сортировка данных по строкам (например как в проводнике).

    Данные в таблице заданы массивом символов data[50][500][256], где максимально возможные значения : 50 столбцов x 500 строк x 256 символлов в ячейке.

    Вопрос : Как отсортировать таблицу ?
    Сообщение отредактировано: E.A. -
      E.A., по сути - тут все элементарно, для 500 строк для qsort переполнения стека и не близко не будет.
      Вопрос в другом, в "дизайне" массива. Нужно правильно определить порядок, а именно - первое измерение это строки, второе - это столбцы, и последнее символы в столбце. В таком вот случае в функции qsort будут передаваться строки для сравнения в функцию сравнения. Соответственно, для реализации сортировки по столбцу в этой функции сравнения нужно сравнивать данные нужного столбца (поля). Все решается приведением типов в функции сравнения и применении собственно операции сравнения двух строк.
        В вашем случае, E.A., будет как-то так:
        ExpandedWrap disabled
          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);


        Добавлено
        Насчёт последней строки не уверен, так надёжнее будет:
        ExpandedWrap disabled
          qsort( (void*)(&data[sortCol][0][0]), 500, 256, compare);


        Добавлено
        Ай, виноват, так только кликнутая колонка и отсортируется. Пардон-с. :blush:

        Добавлено
        Тогда б я посоветовал взять исходник qsort'а (благо она крохотная) и там операцию перемещения пары элементов заменить на нужное перемещение в вашей базе, E.A., раз уж она имеет такое строение строк в памяти. Будет архибыстро и весьма лаконично.
        Но "костылёк" с ГОСТовским qsort'ом, бесспорно, можно и помучать; но надо колдовать... (чую, что надо бы сначала индексы посортировать, а потом уж базой заняться).
          Цитата Славян @
          Ай, виноват, так только кликнутая колонка и отсортируется.

          Как же это произойдёт ?
          Любая сортировка делает сравнение и "swap".
          (Отличия алгоритмов - это, в основном, отличия
          в алгоритмах выбора индексов массива для манипулирования объектами)
          Данная функция делает swap для 32-х битных
          значений. Но ни как не строк.
          ---
          Эту функцию можно было бы удобно использовать,
          если бы кроме пользовательской функции сравнения
          она вызывала пользовательскую функцию "swap".
          ---
          Теоретически возможен вариант - составим массив
          указателей на строки. Тогда можно отсортировать строки
          перестановкой указателей.
          Но в данном случае надо также переставлять строки в других
          столбцах. Поскольку совокупность содержимого ячеек одной строки таблицы
          это один объект сортировки.
          ---
          Тогда получается как-то так:
          1. Изначальный массив с данными не будем изменять, результат будет в аналогичном массиве.
          Заполняем его читая таблицу.
          2. Составляем массив [500] указателей на строки выбранного для сортировки столбца.
          3. Сортируем указатели указанной процедурой
          4. Потом ищем каждый из указателей отсортированного массива указателей в изначальном
          массиве с выбранным столбцом. В результате получим два индекса - старого размещения и нового.
          5. Найденный указатель покажет нам, с какого и на какое место должна быть пернесена информация
          всего ряда ячеек (всех столбцов).
          Копируем все строки по всем столбцам из изначального массива со старым индексом
          в массив результата с новым индексом.
          6. Массив результата выведем в таблицу.
          Сообщение отредактировано: ЫукпШ -
            Цитата E.A. @
            Данные в таблице заданы массивом символов data[50][500][256], где максимально возможные значения : 50 столбцов x 500 строк x 256 символлов в ячейке.

            А здесь разве не вот такой массив должен быть - data[500][50][256]? Т.е. 500 строк, каждая из которых состоит из 50 х 256 символов.
            Ну и сортировать сам этот массив смысла нет - нужно сделать ещё один - массив указателей или индексов строк и сортировать его, и отображать в таблице тоже его.
              Цитата E.A. @
              правда появился ожидаемый недостаток после 1 идет 10 ...

              надо всего лишь изменить алгоритм сравнения строк.

              Добавлено
              Цитата E.A. @
              1)
              Прочитал про сортировку пузырьком. Решил тоже усовершенствовать.

              В Сети легко можно найти описание и исходники
              широко используемых алгоритмов сортировки:
              - пузырьковая сортировка
              - сортировка выбором
              - сортировка вставками
              - шейкерная сортировка (разновидность пузырьковой сортировки)
              - сортировка Шелла
              - быстрая сортировка
              Наверняка подберёшь что-нибудь подходящее.
              Сообщение отредактировано: ЫукпШ -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0309 ]   [ 17 queries used ]   [ Generated: 16.04.24, 12:56 GMT ]