0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 25
1

Отсортировать элементы матрицы

11.05.2016, 16:17. Показов 1109. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам

Дано натуральное N (1 ≤ N ≤ 10), целочисленный квадратный массив-матрица (aij), 0 ≤ i ,j < N. Отсортировать элементы матрицы так, чтобы при прохождении по схеме они были бы упорядочены по не убыванию. Методом быстрой рекурсивной сортировки.
Код
 0  1  2  3
 6  5  4 15
 7  8 14 13
 9 10 11 12
Змейка из двух частей: вначале сверху вниз по строкам «вправо-влево» до побочной диагонали матрицы, потом снизу вверх по строкам «вправо-влево» от побочной диагонали матрицы.

Важное ограничение. При сортировке элементов матрицы не разрешается использовать дополнительные структуры данных (массивы), то есть вся сортировка должна производиться «на месте» – в исходном массиве. Кроме этого нужно сохранить временную сложность алгоритма сортировки: другими словами нельзя вводить дополнительных циклов (например, для вычисления координат) по сравнению с теми, что уже есть в сортировке.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2016, 16:17
Ответы с готовыми решениями:

Отсортировать положительные элементы матрицы по возрастанию, оставив на своих местах отрицательные элементы.
вводится массив 6*6.отсортировать положительные элементы массива по возрастанию,оставив на своих...

Отсортировать элементы главной диагонали матрицы по возрастанию
дан числовой двумерный массив а(н,н) Рассортируйте элементы главной диагонали по возрастанию

Отсортировать элементы матрицы по возрастанию методом обмена
Всем привет! Прошу помощи в решении задач: №1 №2 Помогите пожалуйста, очень необходимо...

Отсортировать элементы каждой строки матрицы по возрастанию
Отсортировать элементы каждой строки матрицы по возрастанию. (Паскаль)

4
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
13.05.2016, 19:21 2
Вычисление индексов матрицы по заданному расположению элементов я сделал: Заполнить матрицу змейкой
0
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
09.10.2016, 00:22 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Быстрая рекурсивная сортировка с выбором среднего (по положению) элемента на основе упомянутого вычисления индексов:
Pascal
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
//глобальные константа и переменные: видны и в программе, и во всех подпрограммах
const m = 10; //максимальный размеры массива
var n, tn, gi, gj: integer; //размер массива, треугольное число, индексы массива
    a: array [0..m-1, 0..m-1] of integer; //массив
 
//процедура генерации массива (можно при желании заменить процедурой ввода)
procedure gen(n: integer);
var i, j: integer;
begin
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do a[i, j] := -99 + random(199)
end;
 
//процедура печати массива,
//параметры: s - заголовок, n - размер массива
procedure prn(s: string; n: integer);
var i, j: integer;
begin
  writeln(s);
  for i := 0 to n - 1 do
    begin
      for j := 0 to n - 1 do write(a[i, j]: 4);
      writeln
    end
end;
 
//функция получения индексов массива, возвращает i, а также i и j в глобальных переменных
//параметр: номер элемента в "хитрой змейке"
//возвращаемые значения: i в gij и в gi, j в gj
//например,                                    a[gij(x), gj]
//                                                ^      ^
//сначала функция вычисляет i и j и возвращает i -+      |
//теперь j (и i тоже) вычислены, можно использовать j ---+
function gij(k: integer): integer;
var p, v: integer; //номер строки с треугольным числом, верхняя граница треугольника
    w: boolean; //флаг нижнего треугольника
begin
  w := k >= tn; //определяем, который треугольник
  if w //если нижний треугольник
    then v := n * n //то граница - последний номер элемента
    else v := tn; //иначе граница - треугольное число
  p := v - 1 - k; //вычисляем номер строки
  gi := trunc(sqrt(1 + 8 * p) - 1) div 2; //индекс i
  gj := p - gi * (gi + 1) div 2; //индекс j
  if odd(n - gi) then gj := gi - gj; //коррекция gj для чётного n-1-i
  if w then gj := n - 1 - gj; //коррекция j для нижнего треугольника
  inc(gi); //общая коррекция i
  if not w then gi := n - gi; //коррекция i для верхнего треугольника
  gij := gi //сама функция возвращает i (а ещё дублирует i и помещает j в глобальные переменные gi и gj)
end;
 
//рекурсивная функция быстрой сортировки (она же - сортировка Хоара)
//параметры: границы сортировки в виде номеров "хитрой змейки"
procedure hoar(l, r: integer);
var i, j, x, y: integer; //текущие границы в "хитрой змейке", середина этого интервала, буферная переменная
begin
  i := l; //сохраняем текущие границы
  j := r;
  x := a[gij((l + r) div 2), gj]; //вычисляем середину
  repeat //цикл сортировки в пределах текущих границ
    while a[gij(i), gj] < x do inc(i); //если элемент нижней границы меньше элемента средней, то отсортировано, увеличиваем нижнюю границу
    while x < a[gij(j), gj] do dec(j); //если элемент верхней границы больше элемента средней, то отсортировано, уменьшаем верхнюю границу
    if i <= j //если индексы не пересеклись,
      then begin //то
        if a[gij(i), gj] > a[gij(j), gj] //если элементы на границах не в том порядке,
          then begin
            y := a[gij(j), gj]; //то меняем их местами
            a[gij(j), gj] := a[gij(i), gj];
            a[gi, gj] := y
          end;
        inc(i); //увеличиваем границы, по-любому за границами уже отсортировано
        dec(j)
      end;
  until i >= j; //если границы встретились или поменялись местами, то сортировка текущего интекрвала закончена
  if l < j then hoar(l, j); //если j больше нижней границы, рекурсивный вызов сортировки интервала от нижней границы до j
  if i < r then hoar(i, r); //если i меньше нижней границы, рекурсивный вызов сортировки интервала от i до нижней границы
end;
 
begin
  randomize; //инициализация ГПСЧ
  repeat //ввод размера массива с проверкой
    write('n in [1..', m, '];  n = ');
    readln(n)
  until n in [1..m];
  gen(n); //генерация массива
  prn('Исходный массив:', n); //печать исходного массива
  tn := n * (n + 1) div 2; //вычисление треугольного числа для последней строки массива
  hoar(0, n * n - 1); //сортировка массива
  prn('Отсортированный массив:', n); //вывод отсортированного массива
  readln
end.
Вычисление индексов переделал в... функцию. Значение i возвращается как значение функции gij и ещё в глобальную переменную gi, значение j возвращается в глобальную переменную gj. Значения gi и gj можно использовать повторно, если нет вызова функции gij в том же операторе, где используются "старые" gi и gj.

Если столь горбатое решение не подходит, пишите, постараюсь переписать программу в "более канонической" форме.

Не по теме:

Дубль этой темы удалён. Не дублируйте темы, это запрещено. Достаточно написать в уже существующую тему новое сообщение, например, из одного слова "Актуально", и тема тут же окажется наверху списка тем раздела.

1
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 25
19.10.2016, 08:47  [ТС] 4
Cyborg Drone, хотелось бы более понятнее и с комментариями желательно
0
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
19.10.2016, 11:56 5
Комментарии добавил.

Пока проще написать не смог. На мой взгляд, длинновато, но всё же просто.
1
19.10.2016, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2016, 11:56
Помогаю со студенческими работами здесь

Отсортировать элементы матрицы выше главной диагонали по возрастанию
отсортировать элементы выше главной диагонали по возрастанию. что-то не работает( for i:=1 to n...

Отсортировать все четные элементы матрицы по строкам по возрастанию
Отсортировать все четные элементы матрицы по строкам по возростанию.

Отсортировать положительные элементы ниже побочной диагонали матрицы по возрастанию
Помогите зделать задачку:Дана матрица N*m.Отсортировать положительные элементы ниже побочной...

Отсортировать элементы матрицы так, чтобы при прохождении по схеме, они были бы упорядочены по не убыванию
Дано натуральное N (1&lt;=N&lt;=10), целочисленный квадратный массив-матрица (aij), 0&lt;= i ,j &lt;N....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru