Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 2 / 0
Регистрация: 02.03.2019
Сообщений: 23

Сортировка двумерного массива методом пузырька

24.09.2022, 16:35. Показов 1892. Ответов 18

Студворк — интернет-сервис помощи студентам
Проблема в том, что алгоритм сортирует лишь до первого элемента второго столбца
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
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
void InitializeArray(const int, char *, int, int);
void DisplayArray(const int, char *);
void Sort_bubble(const int, char *);
void Swap(char &, char &);
int main() {
  system("clear");
  int min = int('!'), max = int('@'), size = 5;
  char arr[size][size];
  printf("\t\tGenerated array\n");
  InitializeArray(size, *arr, min, max);
  DisplayArray(size, *arr);
  printf("\n\t\tSorted array\n");
  Sort_bubble(size, *arr);
  DisplayArray(size, *arr);
  return 0;
}
void InitializeArray(const int size, char *arr, int min, int max) {
  srand(time(NULL));
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      *(arr + i * size + j) = min + rand() % (max - min + 1);
    }
  }
}
void DisplayArray(const int size, char *arr) {
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      printf("%c ", *(arr + i * size + j));
    }
    printf("\n");
  }
}
void Sort_bubble(const int size, char *array) {
  for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
      if (array[j] > array[j + 1])
        Swap(array[j], array[j + 1]);
}
void Swap(char &a, char &b) {
  char temp = a;
  a = b;
  b = temp;
}

Вот тут видно, что посортировало лишь к символу @
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2022, 16:35
Ответы с готовыми решениями:

Сортировка двумерного массива методом пузырька
создать двумерный массив, заполнить его случайными числами от 1 до 50, отсортировать от минимального до максимального. Если в массиве...

Сортировка динамического двумерного массива методом пузырька в функции
Не могу найти ошибку, я ввожу массив и после этого программа закрывается. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void...

Сортировка одномерного массива разными методами: методом пузырька, сортировка выбором, сортировка включением
Составить программу, реализующую сортировки одномерного массива разными методами: методом пузырька, сортировки выбором, сортировка...

18
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
24.09.2022, 16:54
а "i" у вас для мебели

for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
if (array[j] > array[j + 1])
Swap(array[j], array[j + 1]);
0
1 / 2 / 0
Регистрация: 02.03.2019
Сообщений: 23
24.09.2022, 17:02  [ТС]
Цитата Сообщение от SergP01 Посмотреть сообщение
а "i" у вас для мебели
Всмысле для мебели? "i" нужна для строчек, а "j" для столбцов
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
24.09.2022, 17:08
Цитата Сообщение от Illadis Посмотреть сообщение
Всмысле для мебели? "i" нужна для строчек, а "j" для столбцов
где она у вас в сортировке участвует ?
0
 Аватар для programmer_08
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
24.09.2022, 17:09
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
void sort(T** arr, unsigned n, unsigned m)
{
int l = n * m, ind1, ind2, jnd1, jnd2;
for(int i = 0; i < l - 1; i++)
for(int j = i + 1; j < l; j++)
{
ind1 = i / m; ind2 = i % m;
jnd1 = j / m; jnd2 = j % m;
if(arr[ind1][ind2] > arr[jnd1][jnd2])
{
   T tmp = arr[ind1][ind2];
   arr[ind1][ind2] = arr[jnd1][jnd2];
   arr[jnd1][jnd2] = tmp;
}
}
}
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
24.09.2022, 17:17
ну... и нафига готовое решение выкладывать ?

ТСу немного подумать и "i" вставить в нужные места, и все у него с его кодом заработает
1
 Аватар для programmer_08
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
24.09.2022, 17:20
Лучший ответ Сообщение было отмечено Illadis как решение

Решение

SergP01, ещё и с тестом)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <ctime>
#include <cstdlib>
 
template <typename T>
void sort(T** arr, unsigned n, unsigned m)
{
    int l = n * m, ind1, ind2, jnd1, jnd2;
    for(int i = 0; i < l - 1; i++)
        for(int j = i + 1; j < l; j++)
        {
            ind1 = i / m; ind2 = i % m;
            jnd1 = j / m; jnd2 = j % m;
            if(arr[ind1][ind2] > arr[jnd1][jnd2])
            {
                T tmp = arr[ind1][ind2];
               arr[ind1][ind2] = arr[jnd1][jnd2];
               arr[jnd1][jnd2] = tmp;
            }
        }
}
 
template <typename T>
void del(T** arr, unsigned n)
{
    if(arr)
    {
        for(int i = 0; i < n; i++)
            delete[] arr[i];
        delete[] arr;
    }
}
 
template <typename T>
T** create(T** arr, unsigned n, unsigned m)
{
    if(arr)
        del(arr, n);
    arr = new T*[n];
    for(int i = 0; i < n; i++)
    {
        arr[i] = new T[m];
        for(int j = 0; j < m; j++)
            arr[i][j] = 'A' + rand() % ('Z' - 'A');
    }
    return arr;
}
 
template <typename T>
void print(T** arr, unsigned n, unsigned m)
{
    for(int i = 0; i < n; i++)
    {
        std::cout << "\n";
        for(int j = 0; j < m; j++)
            std::cout << arr[i][j] << "  ";
    }
}
 
int main()
{
    srand(time(NULL));
    int n = rand() % 10 + 1, m = rand() % 10 + 1;
    char** arr = NULL;
    arr = create(arr, n, m);
    print(arr, n, m);
    sort(arr, n, m);
    std::cout << "\n\n";
    print(arr, n, m);
    del(arr, n);
    std::cin.get();
    return 0;
}
1
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
24.09.2022, 17:25
Цитата Сообщение от programmer_08 Посмотреть сообщение
ещё и с тестом)
а когда он на работу устроится- тоже за него коды писать будете ?
может стоит-дать шанс подумать...
0
1 / 2 / 0
Регистрация: 02.03.2019
Сообщений: 23
24.09.2022, 17:28  [ТС]
programmer_08, Спасибо, вот только массив должен быть в статической памяти
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
24.09.2022, 17:35
programmer_08, Спасибо, вот только массив должен быть в статической памяти
ваш выход сударь.... носки то забыли погладить
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
24.09.2022, 17:48
Цитата Сообщение от Illadis Посмотреть сообщение
size = 5;
  char arr[size][size];
Так нельзя. Размерами массива могут быть лишь константы времени компиляции.
0
1 / 2 / 0
Регистрация: 02.03.2019
Сообщений: 23
24.09.2022, 21:27  [ТС]
Цитата Сообщение от SergP01 Посмотреть сообщение
ТСу немного подумать
Спасибо, подумал, теперь работает как надо
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
25.09.2022, 14:23
programmer_08, это не сортировка двумерного маассива, а по сути превращение его индексов в одномерные и применение одномерной сортировки.
Зачем все эти лишние умножения деления, если сказано сортировать в 2д, а не костылить преобразование в 1д?
0
 Аватар для programmer_08
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
25.09.2022, 14:55
Kuzia domovenok, ну сортируется-то двумерный массив, так что задача выполнена (имхо так проще). Но вы можете заморочиться чуть больше.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
25.09.2022, 23:15
programmer_08, я могу не заморачиваясь написать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
void sort(T** arr, unsigned n, unsigned m)
{
    bool sorted = false;
    while (!sorted) {
        sorted = true;
        int ipre=0, jpre = 0;
        for (int i=0; i<n; ++i)
            for (int j = (i == 0 ? 1 : 0); j < m; ++j) {
                if (arr[ipre][jpre] > arr[i][j])
                {
                    T tmp = arr[ipre][jpre];
                    arr[ipre][jpre] = arr[i][j];
                    arr[i][j] = tmp;
                    sorted = false;
                }
                ipre = i;
                jpre = j;
            }
    }
}
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
26.09.2022, 09:43
Не намного ли проще скинуть двумерный массив в одномерный, отсортировать одномерный, и затем раскидать обратно?

Добавлено через 1 час 27 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
programmer_08, я могу не заморачиваясь написать
Код рабочий. Но если поставить счетчик, число проходов по массиву приблизительно в 1,5 раза выше, чем при сортировке одномерного массива (вместе с перекидыванием массивов туда-обратно): приблизительно 8500 против фиксированных 5150 обычным пузырьком, для массива 10х10.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
26.09.2022, 10:13
Цитата Сообщение от alexu_007 Посмотреть сообщение
Не намного ли проще скинуть двумерный массив в одномерный, отсортировать одномерный, и затем раскидать обратно?
Как выполнение лишних действий "двумерный массив в одномерный" будет проще? я добавил твой принцип обхода массива не с начала и выиграл
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
    int cnt = 0;
    bool sorted = false;
    int i_min = 0, j_min=1;
    while (!sorted) {
        int t_cnt = 0;
        sorted = true;
        int ipre=0, jpre = 0;
        for (int i= i_min; i<n; ++i)
            for (int j = (i == i_min ? j_min : 0); j < m; ++j) {
                if (arr[ipre][jpre] > arr[i][j])
                {
                    T tmp = arr[ipre][jpre];
                    arr[ipre][jpre] = arr[i][j];
                    arr[i][j] = tmp;
                    sorted = false;
                }
                ipre = i;
                jpre = j;
                ++t_cnt;
            }
        if (!sorted) cnt += t_cnt;
        ++j_min;
        if (j_min == m) {
            j_min = 0;
            i_min++;
        }
    }
1
 Аватар для programmer_08
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
26.09.2022, 13:42
вот наверное главная проблема моего варианта:
Цитата Сообщение от programmer_08 Посмотреть сообщение
C++
1
2
ind1 = i / m; ind2 = i % m;
jnd1 = j / m; jnd2 = j % m;
доп плюс варианта домовёнка будет ещё и проверка на отсортированность массива, т.е. если два раза вызвать функцию сортировки, то вариант домовёнка во второй раз будет уж точно быстрее моего)
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
26.09.2022, 14:19
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Как выполнение лишних действий "двумерный массив в одномерный" будет проще?
Для массива 10х10 это всего 100 итераций. Плюс столько же для перекидывания "одномерный-двумерный". В минусе - требуется дополнительный массив. Ну обычное же дело - выигрыш в памяти, проигрыш в скорости.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.09.2022, 14:19
Помогаю со студенческими работами здесь

Написать программу, сортирующую столбцы двумерного массива методом пузырька
Написать программу, сортирующую столбцы двумерного массива методом пузырька или методом вставки. Парни выручайте.!

Сортировка массива методом пузырька
*Заметки: нужно выделить память под 3 переменные 1 кейс под функцию и адрес динам памяти глобальные переменные не использовать при...

Сортировка массива методом пузырька
Нужно отсортировать массив &quot;B&quot; методом пузырька по возрастанию, но он некорректно работает, например, если ввести массив &quot;С&quot; 3x3:...

Сортировка массива методом пузырька
Задание 1. Сортировка одномерного массива методом обменов (пузырьковым) Написать функцию сортировки одномерного массива, выводящую...

Сортировка массива методом пузырька
Доброго времени суток уважаемые форумчане. Столкнулся с такой проблемой, не знаю как её решить. Суть задачи такова: Нужно реализовать...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru