-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
124 lines (106 loc) · 7.96 KB
/
Program.cs
File metadata and controls
124 lines (106 loc) · 7.96 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Threading;
namespace SpiralSort
{
class Program
{
static int[,] InitArray2d(int countLines, int countColumns)
{
int[,] array = new int[countLines, countColumns];
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Thread.Sleep(15);
array[i, j] = new Random().Next(100);
//array[i, j] = i * array.GetLength(1) + j;
}
}
return array;
}
static void ShowArray2d(int[,] array)
{
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
Console.Write("{0,2} ", array[i, j]);
Console.WriteLine();
}
}
static int[,] SpiralTypeSort(int[,] inArray)
{
// Использую для занесения всех элеметов исходного массива, одномерный (промежуточный) массив flatArray.
int[] flatArray = new int[inArray.GetLength(0) * inArray.GetLength(1)];
for (int i = 0; i < inArray.GetLength(0); i++)
for (int j = 0; j < inArray.GetLength(1); j++)
flatArray[i * inArray.GetLength(1) + j] = inArray[i, j];
// Cортирую одномерный (промежуточный) массив стандартным методом.
Array.Sort(flatArray);
// Переменная с помощью которой будет выполняться итерация по промежуточному массиву flatArray.
int tmpInt = 0;
// Создаю новый массив, в который будут записываться по спирали элементы из промежуточного flatArray.
int[,] outArray = new int[inArray.GetLength(0), inArray.GetLength(1)];
// В случае не квадратных массивов (кол-во столбцов не равно кол-ву строк) определяю по какой координате меньше
// элементов, для определения необходимого числа общих циклов (Количество спиралей, может даже и не полных).
int countCycles = (inArray.GetLength(0) >= inArray.GetLength(1)) ? inArray.GetLength(1) : inArray.GetLength(0);
for (int i = 0; i <= countCycles / 2; i++)
{
// Проверяю есть ли место в результирующем массиве для вывода очередного верхнего ряда
// если нет, формирование результирующего массива закончено, возвращаю результат,
// если есть еще место, вывожу ряд.
if (i > (outArray.GetLength(1) - 1 - i))
return outArray;
for (int k = i; k < inArray.GetLength(1) - i; k++)//Строка выводится полностью, длинна зависит от номера витка спирали.
outArray[i, k] = flatArray[tmpInt++];
// Проверяю есть ли место в результирующем массиве для вывода очередного правого ряда
// если нет, формирование результирующего массива закончено, возвращаю результат,
// если есть еще место, вывожу ряд.
if (i > (outArray.GetLength(0) - 2 - i))
return outArray;
for (int k = i + 1; k < outArray.GetLength(0) - i; k++)//Правый столбец выводится не полностью, т.к. верхний элемент столбца уже заполнен при выводе верхней строки.
outArray[k, outArray.GetLength(1) - 1 - i] = flatArray[tmpInt++];
// Проверяю есть ли место в результирующем массиве для вывода очередного нижнего ряда
// если нет, формирование результирующего массива закончено, возвращаю результат,
// если есть еще место, вывожу ряд.
if (i > (outArray.GetLength(1) - 2 - i))
return outArray;
for (int k = outArray.GetLength(1) - 2 - i; k >= i; k--)//Нижняя строка выводится не полностью, т.к. правый элемент строки уже заполнен выводом правого столбца.
outArray[outArray.GetLength(0) - 1 - i, k] = flatArray[tmpInt++];
// Проверяю есть ли место в результирующем массиве для вывода очередного левого ряда
// если нет, формирование результирующего массива закончено, возвращаю результат,
// если есть еще место, вывожу ряд.
if (i > (outArray.GetLength(0) - 3 - i))
return outArray;
for (int k = outArray.GetLength(0) - 2 - i; k > i; k--)// Левый столбец выводится не полностью, т.к. верхний и нижний элементы столбца уже заполнены во время вывода верхней и нижних строк.
outArray[k, i] = flatArray[tmpInt++];
}
return outArray;
}
static void Main(string[] args)
{
// Программа производит сортировку по возростанию элеметов исходного двухмерного массива, и
// располагает результат по сприрали. Результат выводится на консоль.
Random r = new Random();
do
{
// Создаю двухмерный массив, со случайными количествами
// строк и столбцов. Кол-во может варьироваться от 1 до 10.
int[,] array = new int[r.Next(1, 10), r.Next(1, 10)];
// Метод наполняющий массив значениями.
// В данном случае это заполнение случайными значениями от 0 до 99(включительно).
array = InitArray2d(array.GetLength(0), array.GetLength(1));
Console.Clear();
Console.WriteLine("Массив {0} x {1}.\nИсходный:", array.GetLength(0), array.GetLength(1));
// Метод выводящий двухмерный массив на консоль.
ShowArray2d(array);
// SpiralTypeSort(array) - отсортировывает элементы массива и располагает из по спирали
// Метод возвращает отсортированный массив (тип int[,]).
array = SpiralTypeSort(array);
Console.WriteLine("\nОтсортированный по спирали:");
ShowArray2d(array);
Console.WriteLine("Для продолжения нажмите любую клавишу . . .");
Console.ReadKey();
} while (true);
}
}
}