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

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

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

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

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

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

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

49
 Аватар для andrey_f
884 / 537 / 229
Регистрация: 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
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.01.2025, 13:03
Цитата Сообщение от volvo Посмотреть сообщение
Магией:
int* p = &A[0][0][0];
Это - пример некорректного кода.
Интересует корректный код.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
29.01.2025, 13:43
Цитата Сообщение от Croessmah Посмотреть сообщение
can be viewed as
эти слова говорят о том, что в данном куске стандарта речь идет о трехмерном массиве по семантике, ведь там написано "можно рассматривать как".

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


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

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

Добавлено через 2 минуты
К слову, теме больше 10-ти лет.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
29.01.2025, 13:57
Цитата Сообщение от Croessmah Посмотреть сообщение
А что такое "по внутренней реализации"
я же неспроста стал разделять в данной теме реализацию от семантики. Тут в теме Алексей написал о представлении массива в памяти. Соответственно, не нужно смешать коней и людей. Даже string является массивом по семантике, хотя по внутренней реализации он таковым не является. Очень важно различать внутреннюю реализацию от семантики.
Нельзя вырывать слово из контекста и вводить всех и вся в заблуждении.
В контексте этой темы ТС просит сортировку трехмерного массива. И ничего не случится, если мы будем использовать int[1000] который can be viewed as трехмерный массив по семантике. Конечно, семантика вещь субъективная. Но в контексте данной конкретной задачи int[1000] полностью удовлетворяет критерии для трехмерного массива. А тут уже началась ахинея, а ведь он может быть и двумерным... Речь не в том, чем он может быть вообще. А в том, чем он может быть в конкретной задаче.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
29.01.2025, 13:59
Цитата Сообщение от Royal_X Посмотреть сообщение
int[1000] который can be viewed as трехмерный массив по семантике.
Это по какой-то вашей семантике. В C++ это одномерный массив. Об этом и речь.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
29.01.2025, 14:02
Цитата Сообщение от Croessmah Посмотреть сообщение
по какой-то вашей семантике
если он может хранить трехмерный массив и если мы можем получать доступ к его элементам, то он уже трехмерный массив по семантике. Соответственно, его можно использовать в данной конкретной задаче. Я же не говорю, что int[1000] это трехмерный массив во всех случаях. Будешь использовать его как одномерный, то будет одномерным. Ты вообще можешь засунуть в него только одно число, например, первые цифры числа пи, то тогда будет одним числом по семантике. Или другой пример: ты можешь использовать string для хранения длинного числа. Будет ли это строкой в С++, да. Будет ли числом по семантике, тоже да.
Цитата Сообщение от Croessmah Посмотреть сообщение
В C++ это одномерный массив.
так никто и не спорит. В С++ и "по семантике" это разные вещи.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
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,038
Записей в блоге: 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,038
Записей в блоге: 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,038
Записей в блоге: 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
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
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,038
Записей в блоге: 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
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
29.01.2025, 14:44
Цитата Сообщение от Croessmah Посмотреть сообщение
Что такое "по реализации" вы так и не ответили.
а зачем мне отвечать на общеизвестные факты? по реализации означает, как реализована та или иная вещь внутренне. contiguously allocated уже сводит на нет и опровергает это
Цитата Сообщение от Croessmah Посмотреть сообщение
по реализации ... - это массив, содержащий двумерные массивы
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru