Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] сортировка std::sort


Автор: 3stan 10.3.2010, 20:17
Доброго времени суток.
Суть проблемы: имеется двумерный массив, который нужно отсортировать по возрастанию. В случае со статическим объявлением код

Код

const int nrow = 3, ncol = 3;
float A[nrow][ncol];
...
std::sort(*A,*A+9);


выполняет все, что требуется.

Если же задать массив динамически:
    

Код

int i, j; 
cout<<"\nВведите количество строк и столбцов:\n\n";
cin >> nrow; 
cin >> ncol;

float **A = new float *[nrow];


cout<<"\nВведите элементы массива: \n\n";

for (i = 0; i < nrow; i++)
    {    
        A[i] = new float[ncol];
        for (j = 0; j < ncol; j++)
            cin >> A[i][j];            
    }
...

std::sort(*A,*A+nrow*ncol);


то std::sort не выполняет сортировку. Долго экспериментировал, ничего дельно не вышло.
Подскажите, пожалуйста, что именно нужно указать в сорте, для корректной работы?

Автор: t_gran 11.3.2010, 05:16
3stan, в первом случае вы сортируете двумерный массив как одномерный (но оно и понятно), всё хорошо, все счастливы и все довольны. Допустим вектор 3х3 выглядит так:

Память: [9] [8] [6] [3] [1] [2] [4] [2] [0]

где в скобках значение элемента. Как видите представить из одномерного двумерный не сложно - это всё идёт как смещение.

А вот теперь разберём второй случай.  Тут вы объявляете указатель на указатель. Как это будет выглядеть:

Память: [0xAB122577] [0xB12C00CC] ... [0x3E7A3E7A]

а это, как вы видите, адреса.

В результате к вышесказанному - вы сортируете указатели, а не значения.

Цитата

Подскажите, пожалуйста, что именно нужно указать в сорте, для корректной работы?

Дать методу sort сортировать ваши значения а не указатели.

Может быть мой метод покажется извратом, но более действенного на ум пока ничего не приходит. Суть заключается в том, чтобы представить динамический одномерный массив как двумерный.
Код

#include <algorithm>
#include <iostream>

using namespace std;

int main (int argc, char **argv)
{
   int nrow= 3, ncol= 4; 

   int *A= new int [nrow*ncol];

   for (int i= 0; i < nrow; ++i)
   {
      for (int j= 0; j < ncol; ++j)
      {
         *(A+i*ncol+j)= rand()%89 + 10;
         cout << *(A+i*ncol+j) << " ";
      }
      cout << endl;
   }
   cout << endl;
   
   sort(A, A+nrow*ncol);

   for (int i= 0; i < nrow; ++i)
   {
      for (int j= 0; j < ncol; ++j)
         cout << *(A+i*ncol+j) << " ";
      cout << endl;
   }
}


Результат можно посмотреть http://codepad.org/22B6Yw8Z.

Автор: 3stan 11.3.2010, 12:02
t_gran, огромное спасибо!  smile 
Переделал прогу, все работает. Насчет расположения указателей в памяти я догадывался, поэтому продолжительно шаманил, пытаясь получить значения из динамического двумерного массива, безуспешно) smile 
Но вопрос пока остается открытым, возможно ли в принципе методом sort добиться поставленного результата) Я уже в этом сомневаюсь)
В любом случае попытаюсь защитить лабу преподу. Если будет недоволен, что использовался одномерный массив, придется решать задачу, обходя метод sort.) Спасибо за быструю помощь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)