dfgpdofijg

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

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

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

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

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

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

49
 Аватар для andrey_f
885 / 538 / 230
Регистрация: 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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru