С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 09.06.2018
Сообщений: 45

Отсортировать пузырьком двумерный динамический массив по возрастанию элементов в строках

23.09.2018, 21:23. Показов 2314. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такая проблема. Мне нужно отсортировать двумерный динамический массив по возрастанию в строках.
Так же мне нужно вывести количество сравнений и перестановок. Однако алгоритм плохо работает (При 1 строке и нескольких столбцов пропускает элементы). В чем проблема?
Если есть другие варианты алгоритма, то дайте их пожалуйста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void BubbleSort(int numberOfLines, int numberOfColumns, int** arr, int &NumberOfCompare, int &NumberOfSwap) {
 
    for (int m = 0; m <= (numberOfLines*numberOfColumns); m++)   //сдвиги очередных элементов в правильную позицию
                                               /*сдвиг элемента массива в правильную позицию*/
        for (int i = 0; i < numberOfLines - 1; ++i) {
 
            for (int j = 0; j < numberOfColumns - 1; ++j) {
                /*АНАЛИЗ НА ПОСЛЕДНИЙ ЭЛЕМЕНТ МАССИВА*/
                if (i == numberOfLines && j == numberOfColumns - 1) {  //Если строка последняя и справа тупик, то ничего не делаем
 
                    continue;
                }
                /*КОНЕЦ АНАЛИЗА НА ПОСЛЕДНЮЮ СТРОКУ*/
 
                if (arr[i][j] > arr[i][j + 1]) { //Если элемент не на своей позиции
                    Swap(arr[i][j], arr[i][j + 1]);
                    NumberOfCompare++;
                    NumberOfSwap++;
                }
                else {
                    NumberOfCompare++;
                }
            }
 
        }
    
}
Добавлено через 22 минуты
Всё. Вопрос снят. Нашёл ответ на другом форуме.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int tmp;
    size_t i, j, k, jp, ip;
    size_t size = numberOfLines * numberOfColumns;
    char flag;
 
    do {
        flag = 0;
        for (k = 1; k < size; k++) {
            //Вычисляем индексы текущего элемента
            j = k / numberOfLines;
            i = k - j * numberOfLines;
            //Вычисляем индексы предыдущего элемента
            jp = (k - 1) / numberOfLines;
            ip = (k - 1) - jp * numberOfLines;
            if (arr[i][j] < arr[ip][jp]) {
                tmp = arr[i][j];
                arr[i][j] = arr[ip][jp];
                arr[ip][jp] = tmp;
                flag = 1;
                NumberOfSwap++;
                NumberOfCompare++;
            }
            else {
                NumberOfCompare++;
 
            }
        }
    } while (flag);
Добавлено через 9 минут
А как для этого кода сделать, чтобы он искал только по нечётным строкам?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2018, 21:23
Ответы с готовыми решениями:

Отсортировать динамический массив по возрастанию
Отсортировать динамический массив по возрастанию. Помогите, плз

Отсортировать двумерный динамический массив
Здравствуйте Ребята!Помогите кто разбирается Задание отсортировать двумерный динамический массив Вопрос Сделать с него одномерный...

Как отсортировать двумерный массив по возрастанию методом пузырька?
Напишите пожалуйста код. Нигде не могу найти(

7
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
24.09.2018, 01:07
Цитата Сообщение от blizzark Посмотреть сообщение
C++
1
2
j = k / numberOfLines; 
i = k - j * numberOfLines;
оператор % для кого сделан?
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
24.09.2018, 01:24
Если задание понял правильно, то вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using namespace std;
using Array1d = vector<int>;
using Array2d = vector<Array1d>; 
 
Array2d bubble_sort_2d(const Array2d& input, int &compare_counter, int &swap_counter) {
    Array1d array;
    for (const auto& row : input) {
        array.insert(array.end(), row.begin(), row.end());
    }
 
    compare_counter = 0;
    swap_counter = 0;
    for (int i = 1; i < array.size(); i++) {
        for (int j = array.size() - 1; j >= i; j--) {
            if (array[j - 1] > array[j]) {
                swap(array[j - 1], array[j]);
                swap_counter++;
            }
            compare_counter++;
        }
    }
    
    Array2d result;
    const size_t row_size = input[0].size();
    for (auto iter = array.begin(); iter < array.end(); iter += row_size) {
        result.push_back(Array1d(iter, iter + row_size));
    }
    
    return result;
}
0
2 / 2 / 0
Регистрация: 09.06.2018
Сообщений: 45
24.09.2018, 01:26  [ТС]
stu4ent, Ёмаё.. А можно без векторов? Это ж просто высшее программирование, мне до этого далеко
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
24.09.2018, 01:30
Самому переделать никак?
0
2 / 2 / 0
Регистрация: 09.06.2018
Сообщений: 45
24.09.2018, 01:37  [ТС]
stu4ent, Времени нет вникать в чужой код. Сейчас в спешке всё делаю. Дедлайны сорваны.
0
30 / 21 / 8
Регистрация: 23.09.2018
Сообщений: 186
24.09.2018, 01:52
Лучший ответ Сообщение было отмечено blizzark как решение

Решение

Цитата Сообщение от blizzark Посмотреть сообщение
Времени нет вникать в чужой код. Сейчас в спешке всё делаю. Дедлайны сорваны.
А у меня нет времени писать так, чтобы всем было понятно . Если хочется версию без векторов, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
void bubble_sort_2d(void *input, int row_count, int column_count,
        int &compare_counter, int &swap_counter) {
    int total_size = row_count * column_count;
    int* array = (int*)input;
    
    swap_counter = 0;
    compare_counter = 0;
    for (int i = 1; i < total_size; i++) {
        for (int j = total_size - 1; j >= i; j--) {
            if (array[j - 1] > array[j]) {
                std::swap(array[j - 1], array[j]);
                swap_counter++;
            }
            compare_counter++;
        }
    }
}
 
int main() {
    int data[3][3] = {
        {0,5,7},
        {3,4,2},
        {7,8,9}};
    int compare_counter;
    int swap_counter;    
    
    bubble_sort_2d(data, 3, 3, compare_counter, swap_counter);
        
    return 0;
}
1
2 / 2 / 0
Регистрация: 09.06.2018
Сообщений: 45
24.09.2018, 01:53  [ТС]
Спасибо! Мне еще 4 нужно сортировки сделать. Вот сижу тут и долблюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2018, 01:53
Помогаю со студенческими работами здесь

Двумерный массив (Определить: сумму элементов в тех строках, которые не содержат отрицательных элементов)
Может у каво встречалась данная задача?подскажите пожалусто чем. Определить: сумму элементов в тех строках, которые не содержат...

Добавление элементов в динамический двумерный массив
Помогите пожалуйста, не могу понять в чем ошибка. Функция должна добавлять в массив столбец после столбца в котором находится наибольший...

Отсортировать массив по возрастанию элементов методом выбора
M(n) – массив вещественных чисел.Отсортировать массив введенных чисел по возрастанию элементов методом выбора. for (j=1; j&lt;n; b=y,...

Отсортировать массив по возрастанию элементов методом выбора
M(n) – массив вещественных чисел.Отсортировать массив по возрастанию элементов методом выбора.

Динамический двумерный массив: найти наибольший из нименьших элементов строк
здравствуйте! пишу первый раз, не знаю точно, к С или С++ относится вопрос (п.ч. там нет объектов), я учусь на 2 курсе, нам задали написать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru