На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Сортировка двухмерного массива
    Разыскивается алгоритм сортировки двухмерного массива по убыванию. ???
    С одномерным все просто, а с двухмерным?
    Заранее посибо...
      как сортировать его? Хоть пример бы привел. Можно ведь и так - и сяк. Вобчем, конечный результат опиши.
      Сообщение отредактировано: murph -
        Цитата murph, 23.05.02, 10:28:56
        как сортировать его? Хоть пример бы привел. Можно ведь и так - и сяк. Вобчем, конечный результат опиши.

        Наверное речь идет о том, что первый элемент (1,1) самый малый, а последний самый большой.
        Если знаешь как сортировать одномерный массив, то перейди от двумерного к одномерному и сортируй его как хочешь, а потом обратный переход. Перевод работает элементарно и не тебует больших ресурсов.
        b[l]=a[i,j], где l=i+j*n;для массива размером m x n ;D ;D ;D
          :-/Как сортировать? Обычно! ;D
          Есть массив допустим 3 на 2:
          5 3 1 8
          2 6 4 9
          После сортировки он должен иметь вид:
          9 8 6 5
          4 3 2 1
          У меня пока получилось только такое:
          8 5 3 1
          9 6 4 2
          Т.е. в строке сортируется как надо, а в массиве в целом не фига...


            Смотри выше ;D ;D ;D
              :o Ну ни фига из твоего алгоритма не понял!
              Напиши по подробнее... Можно объяснять на Пальцах/Паскале/С/Бейсике
              Мой icq:159436883
              Сообщение отредактировано: spans -
                Объясняю еще раз.

                Вариант 1

                Есть массив [4x2]
                    0 1 2 3
                    -------
                0 |5 3 1 8
                1 |2 6 4 9
                Из него делаем массив. Например 8 имеет индексы [3,0] а в одномерном с формулой которую я писал выше [4*0+3=3]
                0 1 2 3 4 5 6 7
                --------------
                5 3 1 8 2 6 4 9
                И дальше сортируем его

                Варант 2
                do
                sort=true;
                min=a[0][0];
                for (i=0;i<m;i++)
                 for (j=0;j<n;j++)
                   if (min>a[i][j]) {sort=false;min=a[i][j];
                while (sort);

                  float *pa=(float*)malloc((m*n)*sizeof(float)); //двумерный массив mxn

                  доступ к элементу i,j : *(pa+i*m+j)

                  i изменяется от 1 до m, j - от 1 до n

                  Ну и каким-нить пузырьком, как обычный одномерный массив, сортируешь...

                  з.ы. если еще не понятно - пиши...кину код - мало времени щас...
                    берешь любой варинат сортировки одномерного массива и меняешь там способ доступа.
                    везде вместо arr[i]
                    пишешь arrmxn[i/m][i\%n]
                    соответственно i от 0 до m*n-1.
                    только кот будет немножко долго работать.
                      Могу предложить совершенно плюшевый, но простой и действенный способ (сомому помогло однажды). Находишь минимальный и максимальный элементы в двухмерном массиве. открываешь цикл от мин до макс, перебираешь все числа в твоем массиве, если находишь таковое, то записываешь его в новый массив. таким образом у тебя в новом массиве все числа из старого, но упорядоченные.
                      если хочешь подробнее пиши на майл или аськай #145555157
                        Сколько уже можно объяснять. Уже рассказал и показал два самых доступнях варианта. Не ужели не понятно ;D ;D ;D
                          Вот плод моей извращенной фантазии:

                          Цитата

                          #include <stdio.h>
                          #include <conio.h>
                          #include <time.h>
                          #include <stdlib.h>

                          /*#ifdef NDEBUG
                               #include <windows.h>
                          #endif*/

                          void sortshell (long num, int *array)
                          // num - число эллементов массива
                          // array - сам массив
                          {
                               long i,j,g;
                               short c;
                               int temp;

                               g = num/2;
                               do
                               {
                                     i = g;
                                     do
                                     {
                                           j = i - g;
                                           c = 1;
                                           do
                                           {
                                                 if (array[j] <= array[j+g])
                                                       c = 0;
                                                 else
                                                 {
                                                       temp = array[j];
                                                       array[j] = array[j+g];
                                                       array[j+g] = temp;
                                                 }

                                                 j--;
                                           }
                                           while(j >= 0 && c);

                                           i++;

                                     }
                                     while(i < num);

                                     g /= 2;
                               }
                               while (g > 0);
                          }

                          void printarray(int *iarray, long i1, long i2)
                          // выводим содержимое массива
                          {
                               printf("     ");
                               int i, tmp;
                               
                               for (tmp = 0; tmp < i2; tmp++)
                                     printf ("  \%3i", tmp+1);

                               printf("\r\n     \%c", 218 );
                               for (i = 0; i < (i2)*5-1; i++)
                                     printf("\%c", 196);

                               printf("\r\n ");
                               for (i = 0; i < i1; i++)
                                     for (tmp = 0; tmp < i2; tmp++)
                                     {
                                           if (tmp == 0)
                                                 printf("\%3i \%c", i+1, 179);
                                           printf (" \%3i\%s", iarray[(i*i2)+tmp], ((tmp == i2-1)?"\r\n ":" "));
                          /*#ifdef NDEBUG
                                           Sleep(10);
                          #endif*/
                                     }
                          }

                          void sortmultiarray(int *iarray, long i1, long i2)
                          // сортируем многомерный массив
                          {
                               int i;
                               int max = i1*i2;

                               int *iarray1 = new int[max];

                               if (!iarray1)
                               {
                                     printf("\r\nError... can't allocated memory...");
                                     return;
                               }

                               for (i = 0; i < max; i++)
                                     iarray1[i] = iarray[i];

                               sortshell(max, iarray1);

                               for (i = 0; i < max; i++)
                               {
                                     iarray[i] = iarray1[i];
                               }
                               delete []iarray1;
                          }

                          void main()
                          {
                               const int first = 10;
                               const int second = 10;

                               int iarray[first][second] = {0};

                               srand((unsigned)time(0l));
                               for (int y = 0; y < first; y++)
                                     for (int x = 0; x < second; x++)
                                           iarray[y][x] = (rand() * 999) / RAND_MAX;
                               
                               printarray(iarray[0], first, second);
                               
                               printf("\r\nPress any key to sorting array");
                               while (!_getch());

                               printf("\r\n\r\nSorting... Please wait...");

                               sortmultiarray((int*)iarray, first, second);

                               printf("\r\n\r\nSorted completed\r\n\r\n");

                               printarray(iarray[0], first, second);

                               printf("\r\nPress any key to continue\r\n");

                               while (!_getch());
                               return;
                          }
                          Сообщение отредактировано: SUnteXx -
                            Какие в \%\%\%\%\% преобразования индексов? Для компа все многомерные массивы - одномерные. А при таком раскладе (условии сортировки) сам Бог велел!

                            Объявлеем указатель на одномерный массив размерностью MxN, присваиваем ему адрес двумерного массива. Сортируем этот одномерный массив своим любимым Quick-пузырьком ;D и все - абгемахт!
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0392 ]   [ 14 queries used ]   [ Generated: 17.05.24, 11:28 GMT ]