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

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

24.09.2022, 16:35. Показов 1868. Ответов 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
Заблокирован
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,531
Записей в блоге: 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,531
Записей в блоге: 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,260
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,531
Записей в блоге: 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,260
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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru