2016-02-02 4 views
0

Я пытаюсь сортировать двухмерный динамический массив, когда строка 1 предназначена для идентификатора продукта, а строка 2 - для цены продукта. Я хочу, чтобы отсортировать по продукции ID, и есть результаты отображаются отформатирован с шириной 5. Вот мой код:Сортировка 2D динамического массива C++

Этот раздел прекрасно и делает то, что я ищу:

void readData (int**, int, int); 
void printData(int**, int, int); 
void sortbyPartID(int**, int, int); 

int main() 
{ 
    int index; 
    int **PriceSheet, rows, columns; 
    cout << "Enter the number of Products, and then the number of values associated with the products: "; 
    cout << "For default values, enter 5 (FIVE ITEMS, and enter 2 (TWO Values: ID and PRICE). "; 
    cin >> columns >> rows; 
    cout << endl; 

    PriceSheet = new int* [rows]; 
    for (int row = 0; row < rows; row++) 
     PriceSheet [row] = new int[columns]; 

    readData (PriceSheet, rows, columns); 
    cout << endl; 

    printData(PriceSheet, rows, columns); 

    sortbyPartID(PriceSheet, rows, columns); 

    return 0; 

} 

void readData (int **p, int rowSize, int colSize) 
{ 
    for (int row = 0; row < rowSize; row++) 
    { 

     cout << "Row ZERO is the Product ID and Row 1 is the Product Price\n"; 
     cout << "Enter " << colSize << " numbers for the row number " << row << ": "; 
     for (int col = 0; col < colSize; col++) 
     cin >> p[row][col]; 
     cout << endl; 
    } 
} 

void printData (int **p, int rowSize, int colSize) 
{ 
    cout << "\n\nThese are the Products IDs and Prices as entered in the system:\n"; 
    for (int row = 0; row < rowSize; row++) 
    { 
     for (int col = 0; col < colSize; col++) 
      cout << setw(5) << p[row][col]; 
     cout << endl; 
    } 
} 

Этот раздел является ГДЕ Мне нужна помощь

Он читается правильно и правильно печатает несортированный массив, но я не могу найти способ сортировки массива. В частности, мне нужна помощь в функции сортировки void sortbyPartID. Я хотел бы использовать сортировку пузырьков, и я не могу понять, как заставить эту функцию работать. Любая помощь с функцией сортировки/алгоритмом была бы весьма признательна.

void sortbyPartID (int **p, int rowSize, int colSize) 
{ 
    int swap = -1; 
    int end = colSize; 
    int sortedID = **p; 
    cout << "\n\nThese are the Products sorted Products IDs:\n"; 

    for (int counter = colSize -1; counter >= 0; counter --) 
     for (int index = 0; index < end ; index ++) 
     { 
      if (sortedID[index] > sortedID[index + 1]) 
      { 
       swap = *sortedID[index + 1]; 
       sortedID[index + 1] = sortedID[index]; 
       *sortedID[index] = swap; 
      } 
     } 

    for(int index = 0; index < end; index++) 
    { 
     cout << sortedID[index] << ", "; 
    } 
    cout << endl; 
    end --; 
} 

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

+3

Используйте ['std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort) с помощью специального компаратора (второго прототипа в списке). –

+0

Не используйте пузырьки! N-квадрат времени выполнения делает ваш компьютер грустным! –

+1

Когда вы меняете productID, поменяйте товарPrice на одни и те же индексы. – MASh

ответ

1

int sortedID = **p; не то, что вы хотите, и его следует удалить. (Я думаю, что вы хотели int** sortedID = p;)

Ваш пузырь сортировки должно быть что-то вроде:

for (int counter = colSize -1; counter >= 0; --counter) 
{ 
    for (int index = 0; index < end - 1 ; ++index) 
    { 
     if (p[index][0] > p[index + 1][0]) 
     { 
      // std::swap(p[index], p[index + 1]); 
      int* swap = p[index + 1]; 
      p[index + 1] = p[index]; 
      p[index] = swap; 
     } 
    } 
} 

Live Demo

+0

Благодарим вас за предложения, но это все еще не работает должным образом. Он не выводит отсортированный массив, а только первый элемент первой строки. Элементы второй строки также должны печататься, и их необходимо привязать друг к другу. Я действительно потерялся здесь, поэтому любая помощь будет очень признательна.Это код, который у меня до сих пор: – evoloc

+0

void sortbyPartID **** заголовок такой же, как указано выше { int swap = 0; int end = colSize; int ** sortedID = p; cout << "\ n \ nЭти отсортированные Продукты Идентификаторы продуктов: \ n"; для (INT = счетчика colSize -1; счетчик> = 0; --counter) { для индекса (Int = 0; индекс <конца - 1; ++ индекс) { , если (р [индекс] [ 0]> p [index + 1] [0]) { int swap = p [index + 1] [0]; p [index + 1] [0] = p [index] [0]; p [index] [0] = swap; cout << setw (8) << p [index] [0]; конец -; } } } } – evoloc

+0

Действительно, только что зафиксировал своп (для замены полной строки) вместо первого значения строки. – Jarod42

1

Мы также можем выполнить это с помощью делать-то время следующим образом:

bool isSwaped; 
do 
{ 
    isSwaped = false; 
    for (int index = 0; index < end - 1 ; ++index) 
    { 
     if (p[index][0] > p[index + 1][0]) 
     { 
      int swap = p[index + 1][0]; 
      p[index + 1][0] = p[index][0]; 
      p[index][0] = swap; 
      isSwaped = true; 
     } 
    } 
} while (isSwaped); 
1

Вы можете упростить все, используя объекты. Объекты позволяют обрабатывать связанные данные разумным образом. Также настоятельно рекомендуется использовать векторы вместо массивов C.

struct Product { 
    int id; 
    int price; 
    vector<int> others; 
} 

Вы можете хранить продукты в vector<Product> my_products;, а затем сортировать все с

std::sort(my_products.begin(), my_products.end(), 
      [](const Product& a, const Product& b) { return a.id < b.id; }); 

Вы можете сохранить существующий формат ввода/вывода, но поместить значения в нужном месте. Таким образом, практически невозможно испортить атрибуты, и с ними легко работать.

+0

Благодарим вас за ответ, но одним из требований к этому упражнению является использование массивов. Я не могу обойти это. Хотел бы я использовать векторы. – evoloc

Смежные вопросы