Форум программистов, компьютерный форум CyberForum.ru

Не работает быстрая сортировка для двумерного массива - C++

Восстановить пароль Регистрация
 
bloodflood
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 11
13.02.2013, 01:38     Не работает быстрая сортировка для двумерного массива #1
Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин для двумерного массива. Работает только, если столбцов почему-то 3 или меньше, при больших не работает.
Код функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void quick(int** a, int m, int n) {
 
    int i = 0,j = n;        // поставить указатели на исходные места
    int temp, p;
 
p = a[m][ n>>1 ];        // центральный элемент
    //p=n/2;
  // процедура разделения
  do {
    while ( abs(a[m][i]) < abs(p) ) i++;
    while ( abs(a[m][j]) > abs(p) ) j--;
 
    if (i <= j) {
      temp = a[m][i]; a[m][i] = a[m][j]; a[m][j] = temp;
      i++; j--;
    }
  } while ( i<=j );
 
  // рекурсивные вызовы, если есть, что сортировать 
  if ( j > 0 ) quick(a,m, j);
  if ( n > i ) quick(a+i,m, n-i);
}
Код вызова(m-кол-во строк, n- кол-во столбцов):
C++
1
2
3
4
    for (int v=0; v<m; v++)
    {
        quick(arr, v, n-1);
    }
Буду благодарен помощи.

Добавлено через 33 минуты
Т.е я брал за основу сам метод из прикрепленной темы, и переделал его под двумерный, но он практически не работает.

Добавлено через 2 часа 42 минуты
...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 01:38     Не работает быстрая сортировка для двумерного массива
Посмотрите здесь:

C++ сортировка двумерного массива
"Быстрая" сортировка двумерного массива C++
Ввод массива и быстрая сортировка C++
Сортировка двумерного массива C++
C++ Быстрая сортировка двумерного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
13.02.2013, 04:52     Не работает быстрая сортировка для двумерного массива #2
Цитата Сообщение от bloodflood Посмотреть сообщение
Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин для двумерного массива. Работает только, если столбцов почему-то 3 или меньше, при больших не работает.
Код функции:
Имхо, лучше переделать сортировку под тип void*, как это делает стандартная функция и в качестве "сравнителя" исользовать компаранд. Просто с каждым новым размером массва создаётся новый тип, под который нужно модифицировать код. А ещё лучше использовать готовый варинт.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
13.02.2013, 07:41     Не работает быстрая сортировка для двумерного массива #3
bloodflood, обратите внимание на строчку 23. По Вашему мнению что произойдет после выполнения операции a+i? В общем предлагаю функцию перестроить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void quick(int* a, int n) {
   int i = 0, j = n;        // поставить указатели на исходные места
   int temp, p;
 
   p = a[ n>>1 ];        // центральный элемент
 
   //p=n/2;
   // процедура разделения
   do {
      while ( abs(a[i]) < abs(p) ) i++;
      while ( abs(a[j]) > abs(p) ) j--;
 
      if (i <= j) {
         temp = a[i]; a[i] = a[j]; a[j] = temp;
         i++; j--;
      }
   } while ( i<=j );
 
   // рекурсивные вызовы, если есть, что сортировать
   if ( j > 0 ) quick(a, j);
   if ( n > i ) quick(a+i, n-i);
}
А вызов так:
C++
1
2
3
4
    for (int v=0; v<m; v++)
    {
        quick(arr[v], n-1);
    }
iifat
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,692
13.02.2013, 09:14     Не работает быстрая сортировка для двумерного массива #4
Ты не вполне разобрался с двумерными массивами на ++. Есть множество способов представить двумерный массив; самый простой -- по строкам: первая строка, вторая, третья и т.д., массив передаётся адресом начала. Однако, при этом компилятор не знает количества столбцов. Ну, то бишь, если написать int a[10,10] -- знает, но если в функу передавать -- откуда ему. Поэтому пишешь -- сам! -- и ни в коем разе не a[i][j] -- это вообще другое, -- пишешь a[i*l+j], l -- количество столбцов, i, j -- индексы (это если они с нуля оба отсчитываются).
Yandex
Объявления
13.02.2013, 09:14     Не работает быстрая сортировка для двумерного массива
Ответ Создать тему
Опции темы

Текущее время: 09:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru