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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bloodflood
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 11
#1

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

13.02.2013, 01:38. Просмотров 620. Ответов 3
Метки нет (Все метки)

Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин для двумерного массива. Работает только, если столбцов почему-то 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 минуты
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 01:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает быстрая сортировка для двумерного массива (C++):

Быстрая сортировка двумерного массива - C++
Здравствуйте. У меня есть задание по сортировкам. Нужно заданный двумерный массив из рандомных чисел отсортировать по возрастанию по...

Быстрая сортировка двумерного массива - C++
Возникла проблема с програмой в которой применяется быстрая сортировка двумерного массива. При попытке скомпилировать выдает ошибку: ...

Быстрая сортировка двумерного массива - C++
Нужно отсортировать двумерный массив по убыванию быстрой сортировкой. Вроде всё работает, но не сортирует. В чём может быть дело? ...

Быстрая сортировка двумерного массива - C++
Помогите разобраться с быстрой сортировкой! Для одномерного массива всё понятно, но как сортировать двумерный массив не понимаю. Если б мне...

Быстрая сортировка элементов столбцов двумерного массива, стоящих на четных позициях - C++
нужно отсортировать отсортировать элементы столбцов двумерного массива, стоящих на четных позициях, по убыванию. помогите, пожалуйста)...

"Быстрая" сортировка двумерного массива - C++
Помогите пожалуйста!!! Нужно реализовать &quot;быструю&quot; сортировку для двумерного массива. Не ругайте, я пока что новичок, для одномерного...

3
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
13.02.2013, 04:52 #2
Цитата Сообщение от bloodflood Посмотреть сообщение
Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин для двумерного массива. Работает только, если столбцов почему-то 3 или меньше, при больших не работает.
Код функции:
Имхо, лучше переделать сортировку под тип void*, как это делает стандартная функция и в качестве "сравнителя" исользовать компаранд. Просто с каждым новым размером массва создаётся новый тип, под который нужно модифицировать код. А ещё лучше использовать готовый варинт.
0
anmartex
...
1706 / 1199 / 496
Регистрация: 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);
    }
0
iifat
2252 / 1408 / 108
Регистрация: 05.06.2011
Сообщений: 3,870
13.02.2013, 09:14 #4
Ты не вполне разобрался с двумерными массивами на ++. Есть множество способов представить двумерный массив; самый простой -- по строкам: первая строка, вторая, третья и т.д., массив передаётся адресом начала. Однако, при этом компилятор не знает количества столбцов. Ну, то бишь, если написать int a[10,10] -- знает, но если в функу передавать -- откуда ему. Поэтому пишешь -- сам! -- и ни в коем разе не a[i][j] -- это вообще другое, -- пишешь a[i*l+j], l -- количество столбцов, i, j -- индексы (это если они с нуля оба отсчитываются).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2013, 09:14
Привет! Вот еще темы с ответами:

Быстрая сортировка для массива обьектов пользовательского класса - C++
Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею воспользоваться для сортировки массива обьектов моего класса? Хочу...

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива - C++
Мне нужно отсортировать фрагмент массива, расположенный между первым и последним отрицательным элементом. Немогу понять как устоновить...

Быстрая сортировка (сортировка Хоара) для связных списков - C++
есть у кого готовый алгоритм? или подскажите как реализовать

Быстрая сортировка массива - C++
Программа сортирует числа в valarray с помощью быстрой сортировки, но не все элементы. Помогите исправить код так, чтоб сортировались все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
13.02.2013, 09:14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru