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

Сортировка трехмерного массива

09.07.2014, 11:34. Показов 5069. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выполнить сортировку трехмерного массива методом вставки, пызырька!
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2014, 11:34
Ответы с готовыми решениями:

Сортировка трехмерного массива
нужно отсортировать трехмерный массив. перевожу его в одномерный и хочу отсортировать его, но строка не сортируется, а выводится тот же...

Сортировка трехмерного массива
Не могу понять, как (за приемлемое время - не более 300мс) отсортировать трехмерный массив на 500^3 элементов (куб). Сортировка должна...

Сортировка трехмерного массива (куба)
Добрый день! Мне надо написать программу, которая будет создавать трехмерный массив (куб) и сортировать его значения. После чего эти...

49
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
29.01.2025, 12:45
Студворк — интернет-сервис помощи студентам
то есть такой код полная х*е*а? или все же, так можно сделать для решения задачи ТС??
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
using namespace std;
 
const int X = 2; // Размерность первой оси
const int Y = 2; // Размерность второй оси
const int Z = 2; // Размерность третьей оси
 
void printArray(int arr[X][Y][Z]) {
    for (int i = 0; i < X; i++) {
        for (int j = 0; j < Y; j++) {
            for (int k = 0; k < Z; k++) {
                cout << arr[i][j][k] << " ";
            }
            cout << endl;
        }
        cout << "-----" << endl; // Разделитель между "плоскостями"
    }
}
 
void bubbleSort(int arr[X][Y][Z]) {
    for (int i = 0; i < X; i++) {
        for (int j = 0; j < Y; j++) {
            for (int k = 0; k < Z; k++) {
                for (int l = 0; l < X; l++) {
                    for (int m = 0; m < Y; m++) {
                        for (int n = 0; n < Z; n++) {
                            // Сравнение и обмен элементов
                            if (arr[i][j][k] < arr[l][m][n]) {
                                int temp = arr[i][j][k];
                                arr[i][j][k] = arr[l][m][n];
                                arr[l][m][n] = temp;
                            }
                        }
                    }
                }
            }
        }
    }
}
 
void insertionSort(int arr[X][Y][Z]) {
    int flatSize = X * Y * Z;
    int flatArr[flatSize];
    int index = 0;
 
    // Преобразуем трехмерный массив в одномерный для сортировки
    for (int i = 0; i < X; i++) {
        for (int j = 0; j < Y; j++) {
            for (int k = 0; k < Z; k++) {
                flatArr[index++] = arr[i][j][k];
            }
        }
    }
 
    // Сортировка вставками
    for (int i = 1; i < flatSize; i++) {
        int key = flatArr[i];
        int j = i - 1;
        while (j >= 0 && flatArr[j] > key) {
            flatArr[j + 1] = flatArr[j];
            j--;
        }
        flatArr[j + 1] = key;
    }
 
    // Преобразуем обратно в трехмерный массив
    index = 0;
    for (int i = 0; i < X; i++) {
        for (int j = 0; j < Y; j++) {
            for (int k = 0; k < Z; k++) {
                arr[i][j][k] = flatArr[index++];
            }
        }
    }
}
 
int main() {
    int arr[X][Y][Z] = {
        {
            {3, 1},
            {4, 2}
        },
        {
            {8, 6},
            {5, 7}
        }
    };
 
    cout << "Исходный массив:" << endl;
    printArray(arr);
 
    // Сортировка пузырьком
     bubbleSort(arr);
     cout << "Отсортированный массив (пузырьком):" << endl;
     printArray(arr);
 
    // Сортировка вставками
    insertionSort(arr);
    cout << "Отсортированный массив (вставками):" << endl;
    printArray(arr);
 
    return 0;
}
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
29.01.2025, 13:03
Цитата Сообщение от volvo Посмотреть сообщение
Магией:
int* p = &A[0][0][0];
Это - пример некорректного кода.
Интересует корректный код.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 13:39
Цитата Сообщение от Royal_X Посмотреть сообщение
Добавлю, что в С++ нет никаких трехмерных массивов по реализации.
Цитата Сообщение от Royal_X Посмотреть сообщение
Пока ты мне не докажешь обратное
https://eel.is/c++draft/dcl.array#9

[Note 3: When several “array of” specifications are adjacent, a multidimensional array type is created; only the first of the constant expressions that specify the bounds of the arrays can be omitted.
[Example 4: 
int x3d[3][5][7];
declares an array of three elements, each of which is an array of five elements, each of which is an array of seven integers. The overall array can be viewed as a three-dimensional array of integers, with rank 3 ×5 ×7.
Даже с размерностью угадали. В корень смотрели...
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2025, 13:42
Цитата Сообщение от eva2326 Посмотреть сообщение
Следующий код некомпилябельный:
Вот так надо:
C++
1
2
int A[10][10][10];
int (*p)[10][10] = A;
Цитата Сообщение от volvo Посмотреть сообщение
Магией:
Тут p указывает на мусор где-то далеко за пределами массива.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6260 / 2980 / 1050
Регистрация: 01.06.2021
Сообщений: 11,046
29.01.2025, 13:43
Цитата Сообщение от Croessmah Посмотреть сообщение
can be viewed as
эти слова говорят о том, что в данном куске стандарта речь идет о трехмерном массиве по семантике, ведь там написано "можно рассматривать как".

я же просил доказать, что в С++ есть трехмерные массивы по внутренней реализации.


И вся эта тема со многомерными массивами давно разжевана. Тут на форуме помню, что один эксперт даже говорил, что в самом стандарте многомерные массивы даже не упоминаются, только в каких-то сносках и примечаниях. Я в стандарт не смотрел, но поверю ему на слово.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 13:49
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вот так надо:
Только p - это указатель на двумерный массив
Опять же, не нужно путать указатель с массивом.
int* p - это указатель на один int, а не на массив.

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
эти слова говорят о том
Там выше сказано - создается тип многомерного массива. Трехмерный - лишь частный случай многомерного.
Цитата Сообщение от Royal_X Посмотреть сообщение
С++ есть трехмерные массивы по внутренней реализации
А что такое "по внутренней реализации"? Какие Вы фантазии вынашиваете в своей голове о "правильной" реализации?

Добавлено через 2 минуты
К слову, теме больше 10-ти лет.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6260 / 2980 / 1050
Регистрация: 01.06.2021
Сообщений: 11,046
29.01.2025, 13:57
Цитата Сообщение от Croessmah Посмотреть сообщение
А что такое "по внутренней реализации"
я же неспроста стал разделять в данной теме реализацию от семантики. Тут в теме Алексей написал о представлении массива в памяти. Соответственно, не нужно смешать коней и людей. Даже string является массивом по семантике, хотя по внутренней реализации он таковым не является. Очень важно различать внутреннюю реализацию от семантики.
Нельзя вырывать слово из контекста и вводить всех и вся в заблуждении.
В контексте этой темы ТС просит сортировку трехмерного массива. И ничего не случится, если мы будем использовать int[1000] который can be viewed as трехмерный массив по семантике. Конечно, семантика вещь субъективная. Но в контексте данной конкретной задачи int[1000] полностью удовлетворяет критерии для трехмерного массива. А тут уже началась ахинея, а ведь он может быть и двумерным... Речь не в том, чем он может быть вообще. А в том, чем он может быть в конкретной задаче.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 13:59
Цитата Сообщение от Royal_X Посмотреть сообщение
int[1000] который can be viewed as трехмерный массив по семантике.
Это по какой-то вашей семантике. В C++ это одномерный массив. Об этом и речь.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6260 / 2980 / 1050
Регистрация: 01.06.2021
Сообщений: 11,046
29.01.2025, 14:02
Цитата Сообщение от Croessmah Посмотреть сообщение
по какой-то вашей семантике
если он может хранить трехмерный массив и если мы можем получать доступ к его элементам, то он уже трехмерный массив по семантике. Соответственно, его можно использовать в данной конкретной задаче. Я же не говорю, что int[1000] это трехмерный массив во всех случаях. Будешь использовать его как одномерный, то будет одномерным. Ты вообще можешь засунуть в него только одно число, например, первые цифры числа пи, то тогда будет одним числом по семантике. Или другой пример: ты можешь использовать string для хранения длинного числа. Будет ли это строкой в С++, да. Будет ли числом по семантике, тоже да.
Цитата Сообщение от Croessmah Посмотреть сообщение
В C++ это одномерный массив.
так никто и не спорит. В С++ и "по семантике" это разные вещи.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
29.01.2025, 14:02
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вот так надо:
Видимо не все понимают суть проблемы.
Рассмотрим ещё раз исходное заявление:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Рассматриваем наш массив как одномерный размером 1000 и отдаём std::sort на растерзание
Для того, что бы иметь такую возможность, нужен итератор, который будет способен корректно итерироваться по всему многомерному массиву так, словно этот массив одномерный.

И вот тут возникают сразу две проблемы.

Первая проблема:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main()
{
    int arr[2][3][4] = 
    { 
        { { 1,  2,  3, 4 }, { 5,  6,  7, 8 }, { 9, 10, 11, 12} },
        { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } 
    };
    int* p = &arr[0][0][0];  // ok
    
    for(size_t i = 0; i != 4; ++i)
        std::cout << *p++ << ", ";
    std::cout << "ok\n";
    std::cout << *p << ", UB";
}
UB связанно с выходом за пределы диапазона массива, первый элемент которого служил инициализатором значения указателя.
Некорректно разыменовывать end-итератор:


Вторая проблема связанна с ограничением арифметических операций по отношению к указателям.
Даже если мы не будем разыменовывать указатель, а просто захотим итерировать его значение от начала до конца многомерного массива, то мы уже налетим на UB.
Следующий пример иллюстрирует эту проблему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    int arr[2][3][4] = 
    { 
        { { 1,  2,  3, 4 }, { 5,  6,  7, 8 }, { 9, 10, 11, 12} },
        { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } 
    };
    int* p = &arr[0][0][0];  // ok
    
    for(size_t i = 0; i != 24; ++i)
        p++; // UB произойдет при i равном 5 
}
Это связанно с требованием языка, в отношении Additive operators применительно к указателям
Максимальное значение указателя, который мы проинициализировали адресом элемента массива, может быть равно std::end(arr)

Но если попытаться увеличить это предельное значение ещё хотя бы на единицу, тогда поведение станет неопределенным:
C++
1
2
3
4
5
6
7
#include <iterator>
int main()
{
    int arr[2]= {1,2 };
    int* p = std::end(arr); // ok;
    ++p; // UB
}
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2025, 14:09
Цитата Сообщение от Croessmah Посмотреть сообщение
Только p - это указатель на двумерный массив
Первая размерность это всегда указатель, просто адрес. Вторая размерность это уже тип. Это касается всех остальных размерностей. К сожалению, в С++ как и С, все массивы больше 1 размерности типизированные.
Цитата Сообщение от Croessmah Посмотреть сообщение
int* p - это указатель на один int, а не на массив.
Да. А указатель типа int (*p)[][] это типизированный указатель на тип [][]
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 14:14
Цитата Сообщение от Royal_X Посмотреть сообщение
В С++ и "по семантике" это разные вещи.
Т.е. C++ - язык без своей семантики?
Вот как раз с точки зрения C++ - объявление задает семантические свойства.

Цитата Сообщение от Royal_X Посмотреть сообщение
если он может хранить трехмерный массив и если мы можем получать доступ к его элементам, то он уже трехмерный массив по семантике.
Я же говорю - по какой-то вашей семантике. C++ здесь не причем вообще. На массиве можно и связный список запилить. Это не делает массив связным списком.

Добавлено через 1 минуту
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Первая размерность это всегда указатель, просто адрес.
Это у вас какие-то бешеные фантазии. Нужно четко понимать что есть указатель, а что есть массив. То, что имя массива может быть неявно приведено к указателю на первый элемент не делает массив указателем. Вот это самое "неявно приведено" нужно хорошо понимать и не путать массивы с указателями. И, тем более, не учить этому других.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2025, 14:20
Цитата Сообщение от eva2326 Посмотреть сообщение
UB связанно с выходом за пределы диапазона массива
Это потому, что мы объявили простой указатель (не типизированный), поэтому чтобы итерировать по такому массиву,надо самостоятельно приводить его к нужной размерности.
По моему, тут опасность есть если только массив состоит из структур, когда компилятор выравнивает каждый [] на определенное значение. А если просто выродить многомерный массив в простой, то тут может действительно произойти UB..
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 14:22
Вай, наколдовал я
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2025, 14:26
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Магией:
Тут p указывает на мусор где-то далеко за пределами массива.
Ошибся, не заметил что там нули стоят. Конечно адрес первого элемента.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 14:29
Array-to-pointer decay
There is an implicit conversion from lvalues and rvalues of array type to rvalues of pointer type: it constructs a pointer to the first element of an array. This conversion is used whenever arrays appear in context where arrays are not expected, but pointers are:
https://en.cppreference.com/w/... nter_decay
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6260 / 2980 / 1050
Регистрация: 01.06.2021
Сообщений: 11,046
29.01.2025, 14:31
Цитата Сообщение от Croessmah Посмотреть сообщение
C++ - язык без своей семантики
вы снова искажаете мои слова. Я такого не говорил. Раз вы процитировали мою фразу "В С++ и "по семантике" это разные вещи.", то объясняю, что там как раз была речь о том, что когда говорят в С++ "A является B", или "A может рассматриваться B", то имеют в виду семантику языка С++. Но вот просто "по семантике" не имеет отношения к С++. Тут каждый программист волен использовать все доступные ему инструменты так, как он хочет, не нарушая стандарт, если инструмент по семантике ему подходит.
Вот когда дают задачу создать одномерный массив целых чисел. Я же без проблем могу создать double arr[] и заполнить его целыми числами. Или вы мне скажете, что нужно было взять int или long, или long long... А я вам отвечу, что числа, имеющие тип int или long, или long long, не равносильны математическому определению множества целых чисел. Соответственно, никто не мешает использовать double массив для представления целых чисел. Конечно, язык С++ обделил так называемые integer types и integral types семантически ближе к целым числам (в значении математики) свойствами, и именно по этой причине дефолтно или в большинстве случаев программисты будут использовать именно их для преставления целых чисел (в значении математики). Но это никак не запрещает использовать другие типы или даже кастомные классы и структуры и называть их по семантике целыми числами или массивами целых чисел.

Так что,

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Рассматриваем наш массив как одномерный размером 1000 и отдаём std::sort на растерзание
правильная мысль для решения задачи

К тому же, Алексей не говорил, что он собирается сделать

C++
1
int* p = A;
или

C++
1
int* p = reinterpret_cast<int*>(A);
или

C++
1
int* p = &A[0][0][0];
это уже ваши фантазии.

Возможно, он вообще имел в виду принять как int A[10][10][10]; потом превратить в одномерный размером 1000 путем цикла, создав другую переменную.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 14:37
Ну ладно, вспомним былое:
Цитата Сообщение от Royal_X Посмотреть сообщение
Добавлю, что в С++ нет никаких трехмерных массивов по реализации. А если речь идет о трехмерном массиве по семантике, то все, что может хранить элементы трехмерного массива, является трехмерным массивом.
Именно из вот этого вытекает "Бред", как правильно выразился форумчанин.
Как видим из цитат далее - многомерные массивы есть. Что такое "по реализации" вы так и не ответили.
В C++ массив:
An object of type “array of N U” consists of a contiguously allocated non-empty set of N subobjects of type U, known as the elements of the array, and numbered 0 to N-1.
Так что трехмерный массив в C++ семантически и по реализации (что бы это не значило) - это массив, содержащий двумерные массивы.
Придуманная Вами семантика чего-либо и реализация - это ваши выдумки. В C++ с этим всё ясно. В контексте задачи Вы можете, на мой взгляд, использовать что угодно в рамках разумного, но это не говорит о том, что в C++ нет многомерных массивов.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6260 / 2980 / 1050
Регистрация: 01.06.2021
Сообщений: 11,046
29.01.2025, 14:44
Цитата Сообщение от Croessmah Посмотреть сообщение
Что такое "по реализации" вы так и не ответили.
а зачем мне отвечать на общеизвестные факты? по реализации означает, как реализована та или иная вещь внутренне. contiguously allocated уже сводит на нет и опровергает это
Цитата Сообщение от Croessmah Посмотреть сообщение
по реализации ... - это массив, содержащий двумерные массивы
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.01.2025, 14:45
Royal_X, ну и каша у вас
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2025, 14:45
Помогаю со студенческими работами здесь

Выделить память для трехмерного массива и изменить индексы начального элемента массива
Выделить память для трехмерного массива а. Изменить индексы начального элемента массива на . Протестировать программу

Заполнение трехмерного массива
Есть программа которая считает расстояние скоростного пути.. и если машина находится близко к впереди идущей машине, то программа нам об...

Заполнение трехмерного массива
Помогите с заполнением трехмерного массива, мне нужно чтобы он заполнился по порядку от 0 до 60. #include &lt;stdio.h&gt; #include...

Сумма элементов трехмерного массива
Имеется трехмерный массив из 3-ех слоев по 3Х3 элемента в каждом слое, в первом слое все элементы единицы, во втором слое - двойки, в...

Заполнить срез трехмерного массива
Добрый день. Нужно заполнить срез 3д матрицы (см. вложения, там есть картинка). Все подготовительные этапы по вводу самого массива и...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru