Сортировка пузырём

135
29 ноября 2020, 17:30
Код работает не корректно, но ошибок не выдаёт, помогите найти в чём проблема.

Необходимо сформировать из части элементов двумерного массива одномерный и отсортировать по убыванию.

#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
using namespace std;
class Matrix
{
  private:
    int **Item;
    int Row;
    int Col;
    int *Item2;
  public:
    Matrix();
    Matrix(int R, int C, int Low, int Hi);
    ~Matrix();
    void Out();
    void final();
    void SortUp();
};
void Matrix::Out()
{
    cout << endl;
    for (int i = 0; i < Row; i++)
    {
        for (int j = 0; j < Col; j++)
        {
            cout << Item[i][j] << "\t";
        }
        cout << endl;
    }
}
Matrix::Matrix(int R, int C, int Low, int Hi)
{
    Row = R;
    Col = C;
    Item = new int *[Row];
    for (int i = 0; i < Row; i++)
        Item[i] = new int[Col];
    srand(time(0));
    for (int i = 0; i < Row; i++)
        for (int j = 0; j < Col; j++)
            Item[i][j] = Low + rand() % (Hi - Low + 1);
}
// destructor
Matrix::~Matrix()
{
    for (int i = 0; i < Row; i++)
        delete[] Item[i];
    delete[] Item;
}
void Matrix::SortUp()
{
    int k = 0;
    cout << endl << "Odnomerniyu massive: ";
    for (int i = 0; i < (Row / 2); i++)
    {
        for (int j = (Col / 2); j < Col; j++)
        {
            int *Item2;
            Item2 = new int;  // Item2[k];
            Item2[k] = Item[i][j];
            // cout << Item2[k] << " ";
            k++;
            for (int i = 0; i < k - 1; i++)
            {  // k - длина массива
                for (int j = 0; j < k - i - 1; j++)
                {
                    if (Item2[j] < Item2[j + 1])
                    {
                        int tmp = Item2[j];
                        Item2[j] = Item2[j + 1];
                        Item2[j + 1] = tmp;
                        for (int i = 0; i < Row / 2; i++)
                        {
                            cout << Item2[i] << " ";  // выводим элементы массива
                        }
                    }
                }
            }
        }
    }
}
int main()
{
    Matrix X(7, 7, -10, 100);
    X.Out();
    X.SortUp();
    return 0;
}
Answer 1

Для начале, в Вашем классе Matrix есть декларация конструктора без параметров Matrix(), но нет его определения, зато есть определение конструктора с параметрами Matrix::Matrix(int R, int C, int Low, int High) , хотя в теле класса нет прототипа. Еще в функции

SortUp()
{
//....
int* Item2;
Item2 = new int;  // Item2[k];
Item2[k] = Item[i][j];

Вы закомментировали код, который, вероятно, Вы ожидаете к исполнению. Вы не описали, какую именно часть двумерного массива нужно представить в виде одномерного, но судя по вашему коду, правую верхнюю четверть. Тогда размер выделим так Item2 = new int[(Col/2) * (Row/2 + Row%2)]

В итоге Ваша функция должна выглядеть примерно так:

void Matrix::SortUp()
{
    int k = (Row / 2) * (Col / 2 + Col % 2);  // k - длина массива
    cout << endl << "1 dimensional array: ";
    std::cout << std::endl;
    int* Item2;
    Item2 = new int[k];  
    int index = 0;
    for (int i = 0; i < (Row / 2); i++)
    {
        for (int j = (Col / 2); j < Col; j++)
        {
            Item2[index] = Item[i][j];
            ++index;
        }
    }
    for (int i = 0; i < k; i++)
    {
        cout << Item2[i] << " ";  // выводим элементы массива
    }
    // cout << Item2[k] << " ";
    for (int i = 0; i < k; i++)
    { 
        for (int j = 0; j < k - 1; j++)
        {
            if (Item2[j] < Item2[j + 1])
            {
                int tmp = Item2[j];
                Item2[j] = Item2[j + 1];
                Item2[j + 1] = tmp;
            }
        }
    }
    std::cout << std::endl;
    std::cout << "Sorted arr : " << std::endl;
    for (int i = 0; i < k; i++)
    {
        cout << Item2[i] << " ";  // выводим отсортированные элементы массива
    }
}

p.s. Еще из Вашего класса можно убрать функция final().

READ ALSO
Факториал зависит от порядка условий

Факториал зависит от порядка условий

Почему следующая программа компилируется

206
base operand of ‘-&gt;’ is not a pointer

base operand of ‘->’ is not a pointer

Главное в этой функции всё нормально компилируется

109
Помогите решить задачу на С++

Помогите решить задачу на С++

Дана последовательность из n словДля каждого элемента определить, сколько раз это слово встречалось в этой последовательности раньше ( на позициях...

105
Не срабатывает слот в Qt

Не срабатывает слот в Qt

У меня есть функция, которая вызывает слот:

117